发布于 2026-01-06 0 阅读
0

从代码到游戏:我的 Unity 冒险之旅

从代码到游戏:我的 Unity 冒险之旅

作为一名软件工程师,我一直对错综复杂的游戏开发世界充满好奇。尽管我拥有丰富的编程经验,但踏入这个领域仍然感觉像是打开了一扇通往全新宇宙的大门。这篇博客旨在分享我作为Unity游戏开发新手的成长历程,以及我在此过程中积累的一些初步技巧和心得。

我为什么要自己制作电子游戏,而不是直接玩呢?

我从小就开始玩电子游戏。游戏一直是我释放压力和焦虑的方式,也是我结识了一些挚友的途径。无数个夜晚,我们熬夜玩各种各样的游戏;周末,我们参加FPS(第一人称射击游戏)锦标赛;甚至,我还在家举办局域网派对。

局域网

我常常想着如何将不同游戏的特色融合在一起。我开始思考:“如果我能把这些有趣的机制整合到一个游戏中会怎么样?”当我想象着朋友们的声音作为游戏角色的台词时,这个想法变得更加令人兴奋。
 
然后我突然意识到……

为什么不创作一款融合了我最喜欢的游戏的最佳元素,并加入我朋友们独特声音的游戏呢?这段旅程就此开始。

让我们从简单的开始。

学习基础知识:我做的第一件事就是在 YouTube 上搜索 Unity 的教程。我很快找到了一个名为“Unity 完全新手教程”的视频。这个视频帮助我创建了一个新项目,理解了 Unity 的用户界面,并制作了一个简单的类似 Flappy Bird 的游戏。

从小处着手:我知道自己是个新手,需要一个不需要掌握Unity高级功能,又能让我初步了解游戏开发的项目。因此,我决定从2D僵尸生存游戏入手。这样我既可以练习运用教程视频中学到的知识,又能为项目增添一些个性化的元素。

利用网络资源:有了项目构想和一些新的基本原则后,我回到 YouTube 寻找一些与我想要制作的游戏风格类似的示例。在那里,我找到了“在 Unity 中制作 2D 俯视角 RPG”系列视频。这个系列视频很长(大约 100 个视频),但我可以跳着看,并运用其中的一些核心技巧。

练习,练习,再练习:观看别人实现带有新动画和碰撞检测的新精灵并不能让你自己也掌握这项技能,也无法帮助你记住这些知识。在游戏中,无论做什么,练习都是实现和改进的关键。这是我过去十年作为软件工程师的经验总结出来的。

加入或创建社区:社区对于收集反馈和改进游戏至关重要。它还能为你提供所需的帮助,例如新想法、修复漏洞,甚至添加新的游戏素材!我很幸运,有一群 Discord 好友愿意在这方面提供帮助。我们创建了一个频道,各种想法便纷至沓来。“僵尸应该长什么样?”或者“狙击手职业应该长什么样?”随后,社区成员就添加了一些新的素材供我们使用。

创建新项目:确定要制作一款 2D 僵尸生存游戏后,我使用 Unity 的预置“2D”模板创建了项目,并将代码推送到一个新的私有 GitHub 仓库。这样一来,以后可以方便地添加贡献者,而且如果出现错误或改变主意(这种情况难免发生),也可以回滚到之前的版本。此外,电脑故障也时有发生,所以备份总是没错的。

让我们开始游戏吧!

这款游戏采用 2D 画面,很大程度上决定了角色操控方式。虽然我喜欢像《最终幻想 XI》那样经典的键盘操作,但大多数玩家更喜欢用鼠标控制角色朝向。此外,面对四面八方涌来的僵尸群,使用鼠标操控也更加轻松。因此,我决定采用简单的 WASD 移动键,将技能分别设置为 1-2-3-4,并用鼠标控制视角。

鼠标和键盘

Unity是如何处理玩家移动的?

Unity 提供了多种处理移动输入的方法,包括 Transform、Rigidbody 和 CharacterController。在我的项目中,我使用了 Rigidbody。以下是 PlayerMovement 脚本中一些必要的 Rigidbody 方法示例:

Update()处理移动输入(WASD 键),并调用 RotateTowardsMouse 方法将玩家旋转到鼠标位置。



void Update()
{
  movement.x = Input.GetAxis('Horizontal');
  movement.y = Input.GetAxis('Vertical');

  RotateTowardsMouse();
}


Enter fullscreen mode Exit fullscreen mode

FixedUpdate()根据移动向量和速度移动玩家。



void FixedUpdate()
{
  rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
}


Enter fullscreen mode Exit fullscreen mode

RotateCharacterTowardsMouse()计算玩家与鼠标位置之间的角度,然后旋转玩家以面向鼠标。



void RotateCharacterTowardsMouse()
{
    Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    Vector2 direction = (Vector2)(mousePosition - transform.position);
    float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
    rb.rotation = angle;
}


Enter fullscreen mode Exit fullscreen mode

项目中创建的大多数组件都需要脚本来进行自定义。请注意,当您通过用户界面进行更改时,Unity 会自动更新脚本。

创建好 PlayerMovement 脚本后,您可以将其从“项目”窗口拖放到“检查器”窗口中,从而将其分配给玩家游戏对象。或者,您也可以在“检查器”窗口中点击“添加组件”按钮,搜索 PlayerMovement 并选择它。

配置好移动方式后,您就可以移动一个空的方形模型了。

让我们添加一些自定义精灵吧!

设置玩家和僵尸的精灵图是一个很有趣的过程,我很享受这个过程。我的朋友乔伊制作了这些精灵图,而我则负责搭建所有相关的组件,使它们能够正常工作。我将自定义的玩家模型、僵尸和场景精灵图导入到相应的文件夹中,连接好它们,然后开始设置待机/奔跑状态。

僵尸
 
哇,我被困在黑暗中的灌木丛里,怎么也摆脱不了僵尸!

最糟糕的情况莫过于角色被卡在某个物体上,然后因为糟糕的代码而死亡。所以我一定要确保这一点万无一失。我结合使用了 Collider 和 RigidBody2D,为玩家、僵尸以及所有添加的场景设置了碰撞体积。幸运的是,Unity 在复制模型并保持其碰撞体积方面做得很好。

丧尸应该如何表现?

对于僵尸AI,我希望它们的行为类似于《Project Zomboid》中的表现。如果你进入它们的视野或听觉范围,它们会立即开始攻击并追赶你。玩家在奔跑时应该比僵尸略快。然而,应该在选择逃跑以消耗体力和与僵尸正面交锋之间找到平衡,因为正面交锋可能会因为噪音而引来更多僵尸。

接下来我们应该做什么?

战斗:动画和反馈需要花费大量时间,因为每种武器类型都有其独特的要求。近战武器需要不同的旋转轨迹,远程武器需要不同的动画,而武器尺寸的任何变化都需要更新动画。

用户界面:简洁明了的用户界面对于保持游戏流畅性至关重要,它能为玩家提供生命值、耐力值以及(如果适用)魔法值等关键信息。此外,清晰显示技能冷却时间和当前装备的武器也十分重要。

高级动画:实现玩家死亡、子弹动画、可破坏物体和血液等功能可能具有挑战性,但它们能显著增强游戏的深度。

添加多人游戏模式:要添加多人游戏模式,您可能需要研究一下如何实现 Photon 或镜像功能。这些功能将为您提供所需的网络连接,以便添加其他玩家进行控制。

别忘了玩游戏!

在投入无数时间开发游戏之后,我建议你花些时间亲自体验一下。找出需要改进的地方并记录下来。我所做的许多改进都源于我在现有功能中发现的漏洞。

感谢阅读!

在结束关于我的Unity之旅的演讲之际,我回顾了一路走来所汲取的宝贵经验。这段旅程充满了挑战、创造力和持续学习。

每一次漏洞修复和功能实现都带来了新的见解,加深了我们对游戏开发的理解。重要的是要找到需要改进的地方,并将每一个障碍都视为成长的垫脚石。

感谢您的关注,我希望我的经历能够激励您在 Unity 和游戏开发领域开启自己的冒险之旅。

最后的送别

参考

Unity 完全新手教程

使用 Unity 制作一款 2D 自上而下的角色扮演游戏

文章来源:https://dev.to/devsatasurion/from-code-to-game-my-unity-adventure-3i1f