剧情系统本来打算用插件做的,但是为了巩固下unity决定还是手写,网上看了几个帖子没看出什么效果。我理解的框架就是让游戏逻辑更加清晰,更容易扩展,于是自己想出了一个框架。
整体框架如下:
ChatJson(解析json)
using System.Collections; using System.Collections.Generic; using UnityEngine; using LitJson; public class ChatJson : MonoBehaviour { #region private static ChatJson istance; public static ChatJson instance_ChatJson { get { if (istance == null) istance = new ChatJson(); return istance; } } #endregion void Start () { } void Update () { } //JsonChatItem public ChatItem JsonChat(int i) { JsonData jsonData = JsonMapper.ToObject(Resources.Load<TextAsset>("Chat").text); ChatItem item=new ChatItem(); foreach(JsonData temp in jsonData) { int id = int.Parse(temp["id"].ToString()); // Debug.Log(temp["id"].ToString()); if (id == i) { item.name = temp["name"].ToString(); item.description = temp["description"].ToString(); } } return item; } }MainChat:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class MainChat : MonoBehaviour { #region //单例模式 private static MainChat instance; public static MainChat Instance_MainChat { get { if (instance == null) instance= GameObject.Find("Other").GetComponent<MainChat>(); ; return instance; } } #endregion public GameObject image; public Text text; //id 0-50为剧情显示对话框 //50-X 为NPC显示对话框 private int ChatNum=0;//表示执行到第几个地方了 private int timers = 0;//表示执行几次 private bool isNPC = false;//是否是NPC对话框 private int npcNum = 0;//NPC要发言哪条 void Start () { image.SetActive(false); } void Update () { if (image == true) { if (Input.GetKeyDown(KeyCode.Return)) { timers--; if (timers == 0) { Hide(); } else { ChatShow(); } } } } //剧情提示对话框 public void JuQingChat(int timer) { image.gameObject.SetActive(true); timers = timer; ChatShow(); } //NPC聊天框 public void NpcShowChat(int num) { npcNum = num; isNPC = true; } private void ChatShow() { ChatItem item; if (isNPC) { item = ChatJson.instance_ChatJson.JsonChat(npcNum); }else { item = ChatJson.instance_ChatJson.JsonChat(ChatNum); } string texts = string.Format("<color=red>{0}:</color>\n <size=20><color=blue>{1}</color></size>\n", item.name, item.description); text.text = texts; ChatNum++; } // //隐藏对话框 public void Hide() { isNPC = false; image.gameObject.SetActive(false); } }MainChatNum(主线剧情触发)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MainChatNum : MonoBehaviour { private bool isChat=true;//剧情是否出发完毕 void Start () { } void Update () { } private void OnTriggerEnter(Collider other) { if(other.tag==Tags.player) { if (isChat) { MainChat.Instance_MainChat.JuQingChat(2); isChat = false; } } } }效果如下: