[Unity实战]剧情对话(一)

转自:http://blog.csdn.net/lyh916/article/details/44992805


在网上看到了一篇不错的文章,讲的是游戏中的剧情动画,感觉去做一做也是挺好玩的事,于是就有了这篇文章。游戏中的剧情(非CG动画)主要有两种,一种是自动播放的,另一种是含有对话的。可以把剧情中的一个个动画(这里的动画不仅仅包含角色动画,还包含位移,旋转,时间等待等等)当成一种种状态(有点像状态机),放到一个链表或者队列中,每当一个状态完成时便跳到下一个状态,于是就会形成连环的剧情动画了。


要注意的是,在普通状态下,一个动作完成会跳到下一个动作,但是在对话状态下,一个动作完成时不会自动跳到下一个动作,而是每出现一个新的对话,就会触发动作。


在这里给出核心代码(一个动作基类以及一个管理动作的类):

[csharp]  view plain  copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class Command {  
  5.   
  6.     public virtual void Execute() { }  
  7.     public void Next()   
  8.     {  
  9.         CommandManager.instance.Next2();  
  10.     }   
  11. }  

[csharp]  view plain  copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4.   
  5. public class CommandManager : MonoBehaviour {  
  6.   
  7.     public static CommandManager instance;  
  8.   
  9.     private List<Command> commands = new List<Command>();  
  10.     private int nowIndex = 0;  
  11.     public bool isDialogueMode = false;  
  12.   
  13.     //缓存Transform  
  14.     [SerializeField]  
  15.     public List<string> startObj = new List<string>();//一开始就存在的物体  
  16.     public Dictionary<string,Transform> allObj = new Dictionary<string,Transform>();  
  17.   
  18.     void Awake()  
  19.     {  
  20.         instance = this;  
  21.     }  
  22.   
  23.     void Start()  
  24.     {  
  25.         for (int i = 0; i < startObj.Capacity;i++ )  
  26.             allObj.Add(startObj[i], GameObject.Find(startObj[i]).transform);  
  27.   
  28.         commands.Add(new CommandMusic("Taylor Swift - Red"));  
  29.   
  30.         //场景一 对话驱动画面  
  31.         commands.Add(new CommandDialogueModeEnter());  
  32.   
  33.         commands.Add(new CommandDialogue("Story1", 0, 0, 1));  
  34.         commands.Add(new CommandMove("Main Camera"new Vector3(-3.5f, 3.4f, -5.5f), 6f));  
  35.   
  36.         commands.Add(new CommandDialogue("Story1", 1, 1, 2));  
  37.         commands.Add(new CommandMove("Main Camera"new Vector3(-4.8f, 3.4f, -4.8f), 0f));  
  38.         commands.Add(new CommandMove("Main Camera"new Vector3(-2.5f, 3.4f, -4.8f), 5f));  
  39.   
  40.         commands.Add(new CommandDialogue("Story1", 2, 2, 3));  
  41.         commands.Add(new CommandRotate("Main Camera"new Vector3(10f, 180f, 0f), 0f));  
  42.         commands.Add(new CommandMove("Main Camera"new Vector3(-2.5f, 3.4f, -1f), 0f));  
  43.         commands.Add(new CommandMove("Main Camera"new Vector3(-4.6f, 3.4f, -1f), 5f));  
  44.   
  45.         commands.Add(new CommandDialogueModeExit());  
  46.   
  47.         //场景二 自动  
  48.         commands.Add(new CommandMove("Main Camera"new Vector3(-20.5f, 5.8f, -7.9f), 0f));  
  49.         commands.Add(new CommandRotate("Main Camera"new Vector3(12f, 180f, 0f), 0f));  
  50.   
  51.         commands.Add(new CommandWait(2f));  
  52.         commands.Add(new CommandPlayAnim("skeleton_warrior1", AnimatorManager.instance.run));  
  53.         commands.Add(new CommandPlayAnim("skeleton_warrior2", AnimatorManager.instance.run));  
  54.         commands.Add(new CommandPlayAnim("skeleton_warrior3", AnimatorManager.instance.run));  
  55.         commands.Add(new CommandPlayAnim("skeleton_warrior4", AnimatorManager.instance.run));  
  56.         commands.Add(new CommandPlayAnim("skeleton_warrior5", AnimatorManager.instance.run));  
  57.   
  58.         commands.Add(new CommandWait(2f));  
  59.         commands.Add(new CommandPlayAnim("magic", AnimatorManager.instance.attack1));  
  60.   
  61.         commands.Add(new CommandWait(1f));  
  62.         commands.Add(new CommandPlayAnim("skeleton_warrior1", AnimatorManager.instance.dead));  
  63.         commands.Add(new CommandPlayAnim("skeleton_warrior2", AnimatorManager.instance.dead));  
  64.         commands.Add(new CommandPlayAnim("skeleton_warrior3", AnimatorManager.instance.dead));  
  65.         commands.Add(new CommandPlayAnim("skeleton_warrior4", AnimatorManager.instance.dead));  
  66.         commands.Add(new CommandPlayAnim("skeleton_warrior5", AnimatorManager.instance.dead));  
  67.   
  68.         commands.Add(new CommandPlayAnim("magic", AnimatorManager.instance.stand));  
  69.   
  70.         commands.Add(new CommandDialogue("Story1", 3, 5, 0));  
  71.   
  72.         commands.Add(new CommandWait(1f));  
  73.     }  
  74.   
  75.   
  76.     void Update()  
  77.     {  
  78.         if (Input.GetKeyDown(KeyCode.Q))  
  79.             commands[nowIndex].Execute();  
  80.     }  
  81.   
  82.     //对话模式下直接进入下一状态  
  83.     public void Next()  
  84.     {  
  85.         nowIndex++;  
  86.         if (nowIndex < commands.Count)  
  87.             commands[nowIndex].Execute();  
  88.     }  
  89.   
  90.     //自动模式下直接进入下一状态  
  91.     public void Next2()  
  92.     {  
  93.         if (isDialogueMode)  
  94.             return;  
  95.         else  
  96.             Next();  
  97.     }  
  98. }  

只需要根据自身的需要,写一些继承Command的类即可达到想要的效果了。以下是本人自己扩展的类:


扫描二维码关注公众号,回复: 10175005 查看本文章


效果图:






完整视频链接:http://v.youku.com/v_show/id_XOTMxMjIyMDU2.html

大约两分钟,建议全屏模式下播放(因为不太清晰),自认为剧情还是挺好的。。。

一个更好的方法是写一个编辑器类,将配置保存下来(保存在xml或者json文件),每次运行时读取。不过这里先放一放,最近好忙啊(因为课程的关系,大二下比之前都要忙啊),也不知道下一次写博客是什么时候!哎!


发布了11 篇原创文章 · 获赞 8 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/a1047120490/article/details/73496865
今日推荐