项目的github地址:点击打开链接
以下是我开发MiniCar小游戏的过程和心得体会。
使用GitHub迭代开发与版本控制:
我觉得,在独立开发游戏的过程中,始终明确自己的目标是一件非常重要的事情。使用迭代的思路可以找出当前最重要的几个需求,集中精力来实现,避免的一些不要紧和不明确的小需求上浪费过多时间。版本控制可以在让我放心大胆的去写代码,去比较不同的版本哪个更好,github的不同分支可以很好的实现这一点。
面向对象思想:
通过面向对象设计,可以比较好的分配游戏职责,编程的时候思路也更清晰。
软件架构与设计模式:
我使用的是MVC的架构,将比较好理解,在这个游戏里,像赛车这样的对象作为模型,提供控制的方法,而用户处理,关卡控制作为控制器,用户的界面显示这些模型的信息。如赛车的速度,关卡能否解锁等。
设计模式可以在代码量增长时提供方便的维护方法,用例如观察者模式,状态模式,等可以很好解耦不同类,不同功能之间的依赖,如赛车受到碰撞时要发出碰撞的音效,如果把物理和音效放在一段代码里,会导致两个系统的直接耦合,不利于之后功能的拓展,且可能会发生难以预测的bug。
确定需求是快速开发的关键:
在开发的初始阶段,需求要少而精,确定之后就以此为根据进行面向对象,架构与编程模式的设计,要保持写的代码是可以扩展的,职责是合理且明确的。这样的方式可以避免未来大量的修改与重写,极大的提升效率。
代码命名,格式与注释:
类名,成员变量与函数要意义明确,可以根据它所属的类别加上它的功能进行命名,如一个表示赛车速度的内部成员可以命名为:private float m_speed; 命名的规范有多种多样,但是要合理且有区分,这样易与理解与之后的回顾修改。
代码的格式,注释也以易于阅读为目的,我的风格是将变量声明语句,判断语句,执行语句进行隔行分离。
这是我的代码风格:
using UnityEngine; /// <summary> /// 检查点 /// 1.检测赛车是否通过此检查点 /// 2.方向错误时调用HUD警告方向错误 /// </summary> public class CheckPoint : MonoBehaviour { [Header( "=== 外部控制器 ===" )] [SerializeField] private LevelHud m_levelHud; //关卡HUD [Header( "=== 当前检查点状态 ===" )] [SerializeField] private string m_identifyTag = "CarCollider"; //标识 [SerializeField] private bool m_passed = false; //检查赛车是否通过 //是否通过当前关卡 public bool Passed { get { return m_passed; } } //初始化外部控制器 private void Start() { m_levelHud = FindObjectOfType<LevelHud>(); } //警告错误方向 private void AlertWrongDirection() { m_levelHud.SetWrongDirection( 3 ); } //当赛车进入trigger时执行 private void OnTriggerEnter(Collider other) { //只有速度方向与跑道方向一致,才能认为通过检查点 bool CorrectDirection = Vector3.Dot( other.GetComponentInParent<Rigidbody>().velocity, transform.forward ) > 0; if( !CorrectDirection ) { AlertWrongDirection(); } //若当前检查点已通过,则直接返回 if ( m_passed ) { return; } //只有当赛车正确通过时,才将当前检查点设为已通过 if ( other.CompareTag( m_identifyTag ) && CorrectDirection ) { Debug.Log( "赛车已通过!" ); m_passed = true; } } //若当前检查点为TurnFlag,则会在赛车离开此检查点后将passed置为false, //通过判断“是否通过全部检查点”可以确定行驶一圈后又回到了TurnFlag检查点 private void OnTriggerExit(Collider other) { if( name == "TurnFlag" && other.CompareTag( m_identifyTag ) ) { m_passed = false; Debug.Log( "赛车已离开TurnFlag!" ); } } //公有重设方法 public void ResetPassState() { m_passed = false; } }
文章来源: Unity游戏开发案例分享