永久免费的ppt网站,北京搜索引擎优化seo,南昌网站建设公司渠道,国外做二手工业设备的网站点击对话系统
可实现点击物体后自动移动到物体附近#xff0c;然后弹出对话框进行对话。
基于Unity 简单角色对话UI脚本的编写#xff08;新版UI组件#xff09;和Unity 关于点击不同物品移动并触发不同事件的结合体#xff0c;有兴趣可以看一下之前文章。 下边代码为U…点击对话系统
可实现点击物体后自动移动到物体附近然后弹出对话框进行对话。
基于Unity 简单角色对话UI脚本的编写新版UI组件和Unity 关于点击不同物品移动并触发不同事件的结合体有兴趣可以看一下之前文章。 下边代码为UI界面的公共脚本
public class DialogueUI : MonoBehaviour
{private TextMeshProUGUI nameTexe;//获取名称的Text组件private TextMeshProUGUI descriptionTexe; //获取内容的Text组件private Button resumeButton;//继续对话的按钮public Liststring contentlist;//对话列表private int contentIndex 0;//对话数组private void Start(){//获取组件nameTexe transform.Find(NameText).GetComponentTextMeshProUGUI();descriptionTexe transform.Find(ContentText).GetComponentTextMeshProUGUI();resumeButton transform.Find(ResumeButton).GetComponentButton();resumeButton.onClick.AddListener(this.OnContinueButtonClick);descriptionTexe.text contentlist[0];Hide();}public void Show() {gameObject.SetActive(true);//显示对话框}public void Show(string name, string[] content)//调用方法获得对话{contentIndex 0;nameTexe.text name;contentlistnew Liststring();contentlist.AddRange(content);descriptionTexe.text contentlist[0];Show();}public void Hide() //关闭对话{gameObject.SetActive(false);}private void OnContinueButtonClick(){//调用对话列表如果没有对话窗口关闭contentIndex;if (contentIndex contentlist.Count){Hide();return;}descriptionTexe.text contentlist[contentIndex];}}下边为被点击物体挂载的脚本
public class ItemObject : InteractionObject
{public string name;public string[] contenList;public DialogueUI dialogueUI;protected override void Interact(){print(我就是个东西);dialogueUI.Show(name, contenList);}
}然后是Player挂载的触发脚本
public class PlayerRoutine : MonoBehaviour
{// Start is called before the first frame updateprivate NavMeshAgent PlayerAgent;void Start(){PlayerAgent GetComponentNavMeshAgent();}// Update is called once per framevoid Update(){if (Input.GetMouseButtonDown(0)EventSystem.current.IsPointerOverGameObject()false)//点击鼠标左键并且没有点击到IU组件{Ray rayCamera.main.ScreenPointToRay(Input.mousePosition);//创建一条射线RaycastHit hit;bool isCollide Physics.Raycast(ray, out hit);if (isCollide){if (hit.collider.tag Ground)//假如点击物体的标签为Ground{PlayerAgent.stoppingDistance 0;//停止距离为0PlayerAgent.SetDestination(hit.point);//移动到点击位置}else if (hit.collider.tag NPC) //假如点击物体的标签为NPC{hit.collider.GetComponentInteractionObject().OnClick(PlayerAgent);//调用InteractionObject中的Onclick方法}else if (hit.collider.tag Item) {hit.collider.GetComponentInteractionObject().OnClick(PlayerAgent);}}}}
}还有公共管理类脚本
public class InteractionObject : MonoBehaviour
{private NavMeshAgent PlayerAgent;private bool haveinteractedfalse;//用于判断方法已经调用public void OnClick(NavMeshAgent PlayerAgent) {this.PlayerAgent PlayerAgent;PlayerAgent.stoppingDistance 2;//寻路停止距离PlayerAgent.SetDestination(transform.position);//移动到寻路点haveinteracted false;}private void Update(){if (PlayerAgent ! nullhaveinteractedfalsePlayerAgent.pathPendingfalse)//后边是判断路径是否计算完成{if (PlayerAgent.remainingDistance 2)//距离目标点的距离是否小于2米{Interact();//调用Interact()方法haveinteracted true;}}}protected virtual void Interact() //便于重写{print(点到了NPC);}
}