博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity3D - 5 打飞碟 - 添加物理运动版
阅读量:7023 次
发布时间:2019-06-28

本文共 4285 字,大约阅读时间需要 14 分钟。

打飞碟小游戏 - 物理运动版

效果图

主要场景和上次是一样的,主要是在场记中添加了一个选择,场景中的空游戏对象GameObject添加的场记多了一个选项来选择是否使用物理引擎。
物理引擎选择
打飞碟-1
打飞碟-2

游戏组织结构

这次按照Adapter模式重写了飞碟的控制逻辑,其中RoundController其实就是场记FirstSceneController。上一次我是通过CCActionManager的实例来调用使飞碟运动的方法,这次将方法分离,使用接口IActionManager来发射飞碟,场记与具体运动控制器并不直接连接。
新设计
文件组织结构

代码组织结构

  1. 首先按照需求,我们需要添加接口类IActionManager,它主要用于链接场记和运动管理器,使飞碟运动和判断所以飞碟都已经被回收。

    namespace Interfaces    {        public interface ISceneController        {            void LoadResources();        }        public interface UserAction        {            void Hit(Vector3 pos);            void Restart();            int GetScore();            bool RoundStop();            int GetRound();        }        public enum SSActionEventType : int { Started, Completed }        public interface SSActionCallback        {            void SSActionCallback(SSAction source);        }        public interface IActionManager        {            void PlayDisk(Disk disk);            bool IsAllFinished(); //主要为了防止游戏结束时场景还有对象但是GUI按钮已经加载出来        }    }
  2. 底层运动管理也是不需要重写的,需要重写的主要是用户层的运动管理CCActionManager,主要就是添加继承的接口和重写继承的接口的函数。

    public class CCActionManager : SSActionManager, SSActionCallback, IActionManager    {        int count = 0;//记录所有在移动的碟子的数量        public SSActionEventType Complete = SSActionEventType.Completed;        public void PlayDisk(Disk disk)        {            count++;            Complete = SSActionEventType.Started;            CCMoveToAction action = CCMoveToAction.getAction(disk.speed);            addAction(disk.gameObject, action, this);        }        public void SSActionCallback(SSAction source) //运动事件结束后的回调函数        {            count--;            Complete = SSActionEventType.Completed;            source.gameObject.SetActive(false);        }        public bool IsAllFinished() //主要为了防止游戏结束时场景还有对象但是GUI按钮已经加载出来        {            if (count == 0) return true;            else return false;        }    }
  3. 这次主要的任务还有写一个基于Unity物理引擎的运动控制类,我觉得是使用刚体属性以及施加力来实现。首先需要写一个用户层的物理运动管理CCPhysisActionManager,其实基本和CCActionManager是一样的,只要区别是底层使用的是CCPhysisAction来实例化运动对象。

    public class CCPhysisActionManager : SSActionManager, SSActionCallback, IActionManager    {        int count = 0;//记录所有在移动的碟子的数量        public SSActionEventType Complete = SSActionEventType.Completed;        public void PlayDisk(Disk disk)        {            count++;            Complete = SSActionEventType.Started;            CCPhysisAction action = CCPhysisAction.getAction(disk.speed); //实例化为物理运动对象            addAction(disk.gameObject, action, this);        }        public void SSActionCallback(SSAction source) //运动事件结束后的回调函数        {            count--;            Complete = SSActionEventType.Completed;            source.gameObject.SetActive(false);        }        public bool IsAllFinished() //主要为了防止游戏结束时场景还有对象但是GUI按钮已经加载出来        {            if (count == 0) return true;            else return false;        }    }
  4. 添加具体的物理运动管理类CCPhysisAction,同样是继承自SSAction,在Start初始化的时候添加刚体属性,并且添加X轴上持续的速度ForceMode.VelocityChange,由于重力加速度太大导致画面上飞碟速度太大,只能使用流氓方法添加持续向上的一半的重力使重力加速度减小为g/2。然后当游戏对象到达地面时,由于飞碟工厂的存在,一定要销毁对象的刚体属性否则速度会累积。

    public class CCPhysisAction : SSAction    {        public float speedx;        // Use this for initialization        public override void Start ()        {            if (!this.gameObject.GetComponent
    ()) { this.gameObject.AddComponent
    (); } this.gameObject.GetComponent
    ().AddForce(Vector3.up * 9.8f * 0.6f, ForceMode.Acceleration); this.gameObject.GetComponent
    ().AddForce(new Vector3(speedx, 0, 0), ForceMode.VelocityChange); } private CCPhysisAction() { } public static CCPhysisAction getAction(float speedx) { CCPhysisAction action = CreateInstance
    (); action.speedx = speedx; return action; } // Update is called once per frame override public void Update () { if (transform.position.y <= 3) { Destroy(this.gameObject.GetComponent
    ());//如果不移除刚体属性会导致前面添加的速度属性累积。 destroy = true; CallBack.SSActionCallback(this); } } }
小结:物理运动引擎可以简化我们使用数学方法模拟复杂物理运动的难度,并且可以顺带添加一些简单的物理碰撞效果,比如在物理运动下发射的两个飞碟就可能发生碰撞。

转载地址:http://dppxl.baihongyu.com/

你可能感兴趣的文章
深入探讨Java类加载器
查看>>
Go 开发 HTTP
查看>>
textview的滚动
查看>>
使用JQuery.validate后的bootstrap风格校验提示‏
查看>>
iOS开发中NSTimer的开启与关闭
查看>>
NotePad++中SourceCookifier插件的使用
查看>>
jvm gc日志分析
查看>>
springmvc hello-servlet.xml配置文件
查看>>
kindeditor + syntaxhighlighter 使文章内的插入代码高亮显示
查看>>
基于微博数据用 Python 打造一颗“心”
查看>>
我的Linux发行版/桌面环境选择之路
查看>>
angular2 学习二 [property] - 绑定属性
查看>>
python数据库sqlite基础(一)-------数据库创建,表的建立,数据录入,数据查询...
查看>>
Core Data数据持久性存储基础教程
查看>>
<mvc:view-controller />配置首页路径失效的问题
查看>>
centos7中docker文件挂载,容器中没有执行权限
查看>>
LINQ For Java
查看>>
python socket的简单介绍
查看>>
Python3 urllib GET方式获取数据
查看>>
python使用国内源安装包和升级pip
查看>>