前言

米娜桑好久不见~ 我在九月份发布了一章关于⌜弥星瑞域⌟的原创世界观设定集。在里面我曾提到有一个名为 “纳图理柯”(Naturique)的星球。

这里的生灵们选择了与提克尼科截然不同的进化方向。生物不再信奉科技,转而向 魔法 继续探索,形成了独特的魔法体系。由于没有对科技进行研究,世界并未遭到大量开发探索;且该世界政治文明虽与其他世界相似,但仍成城邦聚落分布。

这是一个很好的游戏设定吧?纳图理柯存在的特别的七元素,以及衍生出来的组合,都能为游戏玩法提供丰富的可能性。这个世界最初就是为了游戏开发应运而生的。

今天,我想和大家分享一下我在开发这个游戏时的思考过程和一些技术细节。希望能给对游戏开发感兴趣的朋友们一些启发。

游戏设计理念

游戏背景可见⌜弥星瑞域

特殊机制

纳图理柯的核心概念是 “魔法元素”。在这个世界中,存在七种基本元素:

MODEL⌟(模型)、⌜CODE⌟(编码)、⌜ERROR⌟(错误)、⌜DATA⌟(数据)、⌜NULL⌟(空值)、⌜VIRTUAL⌟(虚幻)、⌜FIX⌟(修复)

这七种元素可以通过结合产生新的魔法效果(具体可以看世界观设定),并且各元素之间还有相生相克的关系。

graph LR
    A[MODEL] --> B[ERROR]
    B --> C[CODE]
    C --> D[VIRTUAL]
    D --> E[DATA]
    E --> A 
    F[NULL] --> G[FIX]
    G --> F

这就为游戏提供了全新的玩法机制。

游戏玩法

纳图理柯:魔法与程序 将是一款结合了角色扮演、策略元素对战和解密的游戏,采用 2D 俯视视角。莉莉丝 作为织堇镇中的新晋魔女,带着对魔法与世界的好奇心,踏上了探索之旅。

在旅行中,她将遇到各种各样的挑战和谜题,逐步深入了解纳图理柯更深层的秘密。

玩家需要通过合理运用七种魔法元素,解决谜题、战胜敌人,并揭开隐藏在纳图理柯背后的真相。

技术实现

本游戏使用了 Unity 游戏引擎开发,并结合了 C# 进行逻辑实现。

由于这是我第一次尝试制作游戏,出现错误请见谅~ 直接在评论区指出吧!

角色控制与镜头跟随

我利用了 Unity 中的Rigidbody2DBox Collider2D组件实现了对角色和场景的碰撞检测,编写了一个简单的角色控制脚本PlayerController.cs,实现了角色的移动和动画切换。同时,在Main Camera上添加了一个CameraFollow.cs脚本,实现了镜头跟随角色移动的效果。

对于 PlayerController.cs,只需要获取玩家输入的方向,然后根据速度值更新角色的位置:

PlayerController.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class PlayerController : MonoBehaviour {
private static readonly int IsWalking = Animator.StringToHash("isWalking");
private static readonly int Vertical = Animator.StringToHash("Vertical");
private static readonly int Horizontal = Animator.StringToHash("Horizontal");

[SerializeField]
private float moveSpeed = 3f;

[SerializeField]
private float runSpeed = 6f;

private Animator anim;
private Vector2 direction = Vector2.zero;

private void Awake() {
anim = GetComponent<Animator>();
}

private void Update() {
if (direction.magnitude > 0) {
anim.SetBool(IsWalking, true);
anim.SetFloat(Horizontal, direction.x);
anim.SetFloat(Vertical, direction.y);
}
else anim.SetBool(IsWalking, false);
}

private void FixedUpdate() {
float x =Input.GetAxisRaw("Horizontal");
float y = Input.GetAxisRaw("Vertical");
direction = new Vector2(x, y);

// 按下Shift跑步
transform.Translate(direction * ((Input.GetKey(KeyCode.LeftShift)?runSpeed:moveSpeed) * Time.deltaTime));
}
}

值得注意的是,更新移动位置应该是在 FixedUpdate() 方法中进行的,因为它与物理引擎的更新频率一致,可以确保角色移动的平滑性,不会出现更新频率不一致导致碰撞箱回弹。

CameraFollow.cs 中,我们只需要让摄像机的位置跟随角色的位置即可:

CameraFollow.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class CameraFollow : MonoBehaviour {
private Vector3 offset;
private Transform player;

void Start() {
player = GameObject.FindGameObjectWithTag("Player").transform;
offset = transform.position - player.position;

}

void FixedUpdate() {
// 可以根据自己需要调整 1.5f 的大小
transform.position = Vector3.Lerp(transform.position, player.position + offset, Time.deltaTime*1.5f);
}
}

这样就实现了一个简单的角色控制和镜头跟随功能。