首页 > 编程知识 正文

游戏设计原型与开发第二版pdf,unity游戏案例

时间:2023-05-06 10:07:47 阅读:159466 作者:97

这个学期学习了Unity,了解了Unity的游戏框架、功能、组件和C#脚本,对游戏开发有了基本的了解。 在实现这个游戏的过程中,我阅读了一些软件开发相关的书籍,《UML和模式应用》了解了迭代开发的流程和优点,明确了开发的思路,解决了我以前在瀑布模式下开发带来的迷茫和痛苦,《大话设计模式》 《游戏编程模式》 在实际开发过程中,我认为我的编程能力、思维能力、发现和解决问题的能力有了很大的提高。

项目的github地址:单击以打开链接

以下是我开发MiniCar小游戏的过程和心得。

使用GitHub重复开发和版本控制:我认为在独立开发游戏的过程中,始终明确自己的目标是非常重要的。 使用迭代的思路,可以找出目前最重要的几个需求并集中实现,避免在一些无关紧要、不明确的小需求上浪费时间。 版本控制让我放心大胆地写代码,可以比较不同版本哪个更好。 github的不同分支可以很好地实现这一点。

面向对象思想:通过面向对象设计,可以比较好地分配游戏的角色,编程时思路也更清晰。

软件体系结构和设计模式:我使用的是MVC的体系结构。 这个游戏以赛车这样的对象为模型,提供了控制的方法。 用户处理、关卡控制作为控制器,用户界面显示这些模型的信息。 赛车的速度、检查站能否解锁等。

设计模式可以在代码量增加的时候提供方便的维护方法。 例如,观察者模式、状态模式等可以被用于有利地消除不同类别、不同功能之间的相互关系。 例如,赛车受到碰撞时发出碰撞声。 如果在一个代码中加入物理和声音,两个系统会直接结合,不利于后续功能的扩展,可能会产生难以预测的错误。

在制作突破控制器时,观察者模式也发挥了很大的作用。 在以前的代码中,对其他控制器的调用包括在流中,例如在倒计时期间关闭用户的赛车控制、在暂停期间降低声音、在结束时调用UI显示以及在结束时保存数据。 在此流程中,几乎调用了级别控件的所有控制器。 如果某个功能发生了错误,可能需要修改中断控制器的代码。 因此,为了明确编程思路,您可以在中断控制器的每个控制阶段调用一次相关事件,并在其他系统想要响应时订阅该事件,而不是直接调用其他相关控制器。

//事件publiceventactiononchallengeprepare; //在准备阶段调用publiceventactiononchallengestart; //在开始阶段调用publiceventactiononchallengegoingon; //阶段调用publiceventactiononchallengesucceed; //在成功阶段调用publiceventactiononchallengepaused; //暂停阶段调用publiceventactiononchallengefailed; //在失败阶段调用publiceventactiononturnfinished; //结束一周时,publiceventactionontimecountchanged; //计时进行时

确定需求是快速开发的关键。 在开发的初期,需求应该少而精。 确定后,以此为依据进行面向对象。 体系结构和编程模型的设计要求所写代码是可扩展的,责任要合理明确。 这样做可以避免将来的大量修改和重写,大大提高效率。

代码命名、格式和注释:类名、成员变量和函数含义明确,可以根据所属类别及其功能进行命名。 例如,表示比赛速度的内部成员是private float m_speed; 命名规范多种多样,但合理而有区别,便于理解和后续回顾修改。

的格式,其目的是使注释也更容易阅读。 我的风格是将变量声明语句、判断语句、执行语句隔行分离。

这是我的代码样式:

using UnityEngine; ///summary///检查点///1.检测赛车是否通过此检查点///2 .方向错误时发生HUD警告方向错误////summarypublicclassched 关卡hud[header((==当前检查点状态===) ) ) (serializefield ) privatestring m _ identify tag=' car collider ); //[ serialize field ] privateboolm _ 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学习流程:

从零开始学是一件阻力很大的事情,我中间也断断续续的摔过几次键盘,很大程度上是想的功能太多而一个都实现不了,脑子里有些想法,但是要实现起来不知道从何开始。所有,首先要平静下来,慢慢积累知识,坚持学下去。

我是从官方的新手案例开始入手的:

Roll a ball, Space shooter, Survival Shooter等,也可以在官网上看。

通过照着做可以对Unity的编辑器组件脚本这些有一个概念上的认识,然后再深入系统的看Manual和Script API, 然后多做些小demo实践,以实现功能为主。再之后开始学习了一些开发的流程和设计模式,做现在的这个游戏,在这段过程中,代码的规范就变的很重要的,编写前的设计也是。








        

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。