毕业设计之剧情系统(NPC对话框)

  剧情系统本来打算用插件做的,但是为了巩固下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;
            }
        }
    }
}
效果如下:


猜你喜欢

转载自blog.csdn.net/qq_35957011/article/details/79637444