利用NGUI与XML实现RPG游戏对话框

利用NGUI与XML实现RPG游戏对话框_第1张图片

成品图,并且可以通过点击白色背景往后载入。

制作方法


建立如图所示的层级结构,第一层利用已经做好的Atlas创建




然后通过NGUI的UIButton中的OnClick调用指定方法

利用NGUI与XML实现RPG游戏对话框_第2张图片

利用NGUI与XML实现RPG游戏对话框_第3张图片


上图是那三个层级的挂载脚本

整个NGUI控制我都挂在UIRoot上

代码如下

using UnityEngine;
using System.Collections;
using System.Xml;

public class NGUIButtonClick : MonoBehaviour {
	private UILabel RTalkSome;
	private UISprite RPhoto;

	private UILabel PTalkSome;
	private UISprite PPhoto;

	public GameObject RemiT;
	public GameObject PatchT;//使用两个对象的原因是因为在对象设置为不激活时,Find()函数无法调用

	private int stringCount = 0;
	private ArrayList allPersonName = new ArrayList();
	private ArrayList allExpression = new ArrayList();
	private ArrayList allSaid = new ArrayList();//动态数组,便于添加,并通过stringCount控制

	private string[] RAllFace = new string[]//本地图片加载到atlas中,这个是里面的名字控制,在下面的方法中需要使用
	{
		"レミリア_呆れ",
		"レミリア_驚き",
		"レミリア_怒り",
		"レミリア_泣き",
		"レミリア_特殊",
		"レミリア_笑い",
	};
	private string[] PAllFace = new string[]//我使用的是东方系列的图片
	{
		"パチュリー_呆れ",
		"パチュリー_驚き",
		"パチュリー_怒り",
		"パチュリー_泣き",
		"パチュリー_笑い",
		"パチュリー_通常",
	};
	void Start()
	{
		RTalkSome = GameObject.Find ("STalking").GetComponent ();
		RPhoto = GameObject.Find ("RemiliaTalk").GetComponent ();

		PTalkSome = GameObject.Find ("PTalking").GetComponent ();
		PPhoto = GameObject.Find ("PatchouliTalk").GetComponent ();

		GameObject.Find ("RemiliaTalk").SetActive (false);//Find()方法有问题,当对象不是激活态的时候,用Find无法找到对象,必须在开始使用public
		GameObject.Find("PatchouliTalk").SetActive(false);
		allContent.Clear ();
		LoadFromXML ();
	}
	void ShowTalking()
	{
		if (stringCount < 5) {//读取了XML后按照三个数组依次载入人物,人物表情,对话
			if((string)allPersonName[stringCount] == "Remilia")
			{
				PatchT.SetActive(false);
				RemiT.SetActive(true);
				RPhoto.spriteName = RAllFace[(int)allExpression[stringCount]];
				RTalkSome.text = (string)allSaid[stringCount];
				stringCount++;
			}
			else if((string)allPersonName[stringCount] == "Patchouli")
			{
				PatchT.SetActive(true);
				RemiT.SetActive(false);
				PPhoto.spriteName = PAllFace[(int)allExpression[stringCount]];
				PTalkSome.text = (string)allSaid[stringCount];
				stringCount++;
			}	
		}
		else
		{
			PatchT.SetActive(false);
			RemiT.SetActive(false);
		}


	}
	void LoadFromXML()//XML的调用
	{
		string filepath = Application.dataPath+ @"/Xml/test.xml";
		XmlDocument xmlDoc = new XmlDocument ();
		xmlDoc.Load (filepath);
		XmlNodeList nodeList = xmlDoc.SelectSingleNode ("Dialogue").ChildNodes;//users下的子节点

		foreach (XmlElement xe in nodeList) {
			foreach(XmlElement x1 in xe.ChildNodes)//搜索当前标识的子节点
			{//由于每次只搜一条,采用此种方法不能使用结构体,易出现空值
				if(x1.Name == "name")
				{
					allPersonName.Add(x1.InnerText);
				}
				if(x1.Name == "expression")
				{
					allExpression.Add(int.Parse(x1.InnerText));
				}
				if(x1.Name == "said")
				{
					allSaid.Add(x1.InnerText);
				}
			}
		}
	}


	public void ClickOnSprite()
	{
		stringCount = 0;
		ShowTalking ();
	}
	public void ClickOnLable()
	{
		print ("Lable");
	}
	public void ClickOnBackGround()//调用来显示XML的对话内容
	{
		ShowTalking ();
	}
}


  
    Remilia
	0
    我有些话想要说
  
 
    Remilia
	0
    就是这些了
  
  
    Patchouli
	1
    你还想听什么
  
  
    Remilia
	2
    测试还不够么
  
  
    Patchouli
	5
    就是这样
  
  
    Remilia
	5
    再见!
  

以上就是完整的代码实现,并附有注释,欢迎讨论

你可能感兴趣的:(Unity学习日志)