贴一个github地址
https://github.com/ddghost/unity3d/tree/master/unity%20hw3

实现牧师与魔鬼的动作分离

按照老师给的层次进行改进

刚开始对动作的分离还不是太清晰,现在想想,动作分离应该就是把游戏里的动作实现从场记那里抽离出来,另外写一个动作管理器来提供接口进行对象动作的增删。
最开始的动作实现(仅以船为例,由于牧师与魔鬼是直接到船上的,所以没有位移)是通过在船上挂载一个处理鼠标点击的脚本(toSolveClick)和一个运动脚本(updateBoatMove)。

public boatController(string size){boat = Object.Instantiate (Resources.Load ("prefabs/boat", typeof(GameObject)), rightPos , Quaternion.identity, null) as GameObject ;boat.name = "boat";//给船对象添加两个脚本toSolveClick = boat.AddComponent (typeof(firstScenceSolveClick)) as firstScenceSolveClick;toSolveClick.setName (boat.name);updateBoatMove = boat.AddComponent (typeof(boatMoveBeahave)) as boatMoveBeahave;//defaultSize = size;this.size = defaultSize;}

当鼠标点击后,脚本通知场记,然后场记进行处理。

firstScenceUserAction action ;
void OnMouseDown(){if (action.getStatus() != "playing") {return;}else{if (characterName == "boat") {action.boatMove ();}else {action.getBoatOrGetShore (name);}}}

若符合开船条件就修改运动脚本中的目的地来实现运动。

    public void boatMove(){//判断船是否能开if (!myBoat.ifEmpty () && myBoat.getRunningState() != "running") {string toSize;string[] passengers = myBoat.getPassengerName();if (myBoat.size == "left") {toSize = "right";}else {toSize = "left";}// 船到另一岸了,因此船上的人物也要到另一岸,for (int loop = 0; loop < 2; loop++) {for (int loop1 = 0; loop1 < numOfPirestOrDevil * 2; loop1++) {if (peopleCtrl [loop1].getName () == passengers [loop]) {peopleCtrl [loop1].size = toSize;}}}//开船myBoat.move ( );}//myboat里的move函数,两端代码在不同的类中public void move(){if (size == "right") {updateBoatMove.setAim (leftPos);size = "left";} else {updateBoatMove.setAim (rightPos);size = "right";}}

这样的话,运动的代码是在场记中实现的,场记做的东西就有点太多了。

现在有了动作管理器,可以通过动作管理器给对象添加动作删除动作,而不是像之前那样一直挂着一个脚本,这样看起来也就更科学了。
逻辑依旧是点击船后,船上的脚本通知场记,场记判断是否能开船后通知船的控制器。
代码与之前不同的是不用再添加两个脚本到船上。

public boatController(string size){boat = Object.Instantiate (Resources.Load ("prefabs/boat", typeof(GameObject)), rightPos , Quaternion.identity, null) as GameObject ;boat.name = "boat";//只有一个脚本了toSolveClick = boat.AddComponent (typeof(firstScenceSolveClick)) as firstScenceSolveClick;//toSolveClick.setName (boat.name);defaultSize = size;this.size = defaultSize;}

还修改了船的控制器中的move函数。

public void move(CCActionManager actionManager){CCBoatMoveing boatMove = CCBoatMoveing.GetSSAction (10f);if (size == "right") {boatMove.aim = leftPos;size = "left";} else {boatMove.aim = rightPos;size = "right";}//交由动作管理器添加动作actionManager.RunAction (boat , boatMove , null );}

动作和动作管理器的基类都是照搬老师代码,虽然这次的动作只有船的左右移动,并且也没有进行动作回调(ISSActionCallback),但是也还是能帮助加深对动作管理器的理解。

//动作基类
public enum SSActionEventType : int { Started, Competeted }public interface ISSActionCallback
{void SSActionEvent(SSAction source, SSActionEventType events = SSActionEventType.Competeted,int intParam = 0, string strParam = null, Object objectParam = null);
}public class SSAction : ScriptableObject
{public bool enable = true;public bool destroy = false;public GameObject gameobject { get; set; }public Transform transform { get; set; }public ISSActionCallback callback { get; set; }protected SSAction() { }public virtual void Start(){throw new System.NotImplementedException();}public virtual void Update(){throw new System.NotImplementedException();}
}//动作管理器基类
public class SSActionManager : MonoBehaviour {private Dictionary<int, SSAction> actions = new Dictionary<int, SSAction>();private List<SSAction> waitingAdd = new List<SSAction>();private List<int> waitingDelete = new List<int>();// Use this for initializationvoid Start(){}// Update is called once per frameprotected void Update(){foreach (SSAction ac in waitingAdd) actions[ac.GetInstanceID()] = ac;waitingAdd.Clear();foreach (KeyValuePair<int, SSAction> kv in actions){SSAction ac = kv.Value;if (ac.destroy){waitingDelete.Add(ac.GetInstanceID());}else if (ac.enable){ac.Update();}}foreach (int key in waitingDelete){SSAction ac = actions[key]; actions.Remove(key); DestroyObject(ac);}waitingDelete.Clear();}public void RunAction(GameObject gameobject, SSAction action, ISSActionCallback manager){action.gameobject = gameobject;action.transform = gameobject.transform;action.callback = manager;waitingAdd.Add(action);action.Start();}
}

unity3d 牧师与恶魔动作分离相关推荐

  1. Unity3D游戏编程-牧师与恶魔 动作分离版

    Unity3D游戏编程-牧师与恶魔 动作分离版 文章目录 Unity3D游戏编程-牧师与恶魔 动作分离版 作业要求 项目配置 项目演示 视频演示 项目下载 文字说明 项目截图 实现过程和方法(算法) ...

  2. 牧师与恶魔——动作分离版

    Priests and Devils --动作分离版 完整工程文件在github(https://github.com/JennySRH/3DGame/tree/master/PriestsAndDe ...

  3. 用Unity3D实现简单的牧师与魔鬼游戏(动作分离版)

    用Unity3D实现简单的牧师与魔鬼游戏(动作分离版) 项目地址 牧师与魔鬼游戏(动作分离版) 完成效果图 上次博客链接 牧师与魔鬼游戏 实现心得 这次作业是在上次作业的基础上完成的,具体做出的改变是 ...

  4. 牧师与魔鬼——动作分离版

    牧师与魔鬼--动作分离版 在上周的作业中,牧师与魔鬼游戏中的各个事件,都是写在Director中,并且都是继承Monobehavior的.在这周动作分离的设计中,我将上船.下船以及船的移动都分离出来. ...

  5. unity编程实践-牧师与魔鬼动作分离版

    作业要求 牧师与魔鬼 动作分离版 [2019开始的新要求]:设计一个裁判类,当游戏达到结束条件时,通知场景控制器游戏结束 目标:建立动作管理器,使动作抽象出来,可以应用到任何游戏对象上,以此提高代码复 ...

  6. 【3D游戏编程与设计】四 游戏对象与图形基础 : 构建游戏场景+牧师与魔鬼 动作分离版

    [3D游戏编程与设计]四 游戏对象与图形基础 : 构建游戏场景+牧师与魔鬼 动作分离版 基本操作演练 下载 Fantasy Skybox FREE, 构建自己的游戏场景 下载 Fantasy Skyb ...

  7. 牧师与魔鬼 动作分离版

    1.基本操作演练 下载 Fantasy Skybox FREE 在unityAssetStore中下载Fantasy Skybox FREE 构建游戏场景: GameObject->3D Obj ...

  8. Unity实现牧师与魔鬼动作分离版

    牧师与魔鬼动作分离版 项目地址 动作管理器的设计 程序设计框架: 为了用一组简单的动作组合成复杂的动作,我们采用 cocos2d 的方案,建立与 CCAtion 类似的类. 通过门面模式(控制器模式) ...

  9. 基于Unity开发的牧师与魔鬼动作分离版游戏设计

    1 作业要求 牧师与魔鬼 动作分离版 设计一个裁判类,当游戏达到结束条件时,通知场景控制器游戏结束 2 实现细节 在原来代码的基础上,修改如下: 将UserGUI的sign成员变量和Controlle ...

最新文章

  1. 【AWT编写图形用户界面】GUI编程之AWT讲解(看不懂你来打我)
  2. CodeBlacks16\17\20版本下载
  3. 天了噜!定义static字段还有顺序要求?
  4. 三思笔记_使用反射前先三思
  5. “Transaction rolled back because it has been marked as rollback-only”
  6. php 失去 焦点 另一个表单猎取值,同一表单如何根据某一个文本框的值 改变另一个文本框的值...
  7. 合影效果(信息学奥赛一本通-T1182)
  8. 容器编排技术 -- Kubernetes Ingress解析
  9. TorchSeg—基于PyTorch的快速模块化语义分割开源库
  10. Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
  11. 【matlab】元胞数组(使用celldisp显示元胞数组)
  12. Property ‘id‘ not found on type java.lang.String问题解决
  13. 在myql sqlserver 快速找到带有关键字的表
  14. ati.c ATI顯卡開發源代碼
  15. android 越来越慢,为什么安卓手机总是越用越慢?怎么...
  16. 葫芦时刻_Hulu将提供离线观看(最终)
  17. 二进制、八进制、十进制、十六进制的英文及简写
  18. 数据挖掘与分析——回归模型
  19. 使用蓝牙连接设备显示无法连接的解决方案
  20. 计算机counta函数怎么用,Excel函数公式:Counta函数的多功能应用~

热门文章

  1. 图像处理(5) : 形态学处理
  2. 性能测试之常见性能缺陷
  3. 上海市大学生网络安全大赛题解
  4. 区块链技术应用落地区块链融资租赁
  5. 气动管道传输系统概述
  6. Datawhale 第一次打卡
  7. 红米k30pro变焦版和红米k30至尊版 的区别
  8. 微信公众平台的php示例,微信公众平台PHP示例一
  9. python写微信公众号文章_python如何导出微信公众号文章
  10. 济民可信20亿战略资金助力大健康产业,一号护工建立护工行业标准