Unity游戏开发案例分享

匿名 (未验证) 提交于 2019-12-03 00:30:01

项目的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;          } }









标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!