using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
/// <summary>
/// NPC和Pickable的父类
/// </summary>
public class InteractableObject : MonoBehaviour
{
private NavMeshAgent playerAgent;
private bool haveInteeacted;标志位(是否进行交互过,默认每次点击只交互一次)
public void OnClick(NavMeshAgent playerAgent)//将 NavMeshAgent 组件传递过来。
{
this.playerAgent = playerAgent;
playerAgent.stoppingDistance = 2;与被交互的物体设置的边距(保证不穿模)。
playerAgent.SetDestination(transform.position);//设置目标位置让其移到附近。
haveInteeacted = false;//添加上这个便可以将面板再次显示。
}
private void Update()
{
if(playerAgent != null && haveInteeacted == false && playerAgent .pathPending==false)
{
if(playerAgent.remainingDistance<=2)//到达目标位置才进行交互。
{
Interact();//交互
haveInteeacted = true;
}
}
}
protected virtual void Interact()
{
print("Interacting with Interactable Object.");
}
}
NPCObject 类
csharp复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 定义NPC
/// </summary>
public class NPCObject : InteractableObject//继承自InteractableObject
{
public new string name;
//public string Name { get; set; }
public string[] contentList;
//public DialogueUI dialogueUI;
protected override void Interact()
{
//dialogueUI.Show(name, contentList);
DialogueUI.Instance.Show(name, contentList);
}
}
PickableObject 类
csharp复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 定义Pickable的动作
/// </summary>
public class PickableObject : InteractableObject
{
public ItemScriptObject itemSO;//用来表示哪个Item
protected override void Interact()
{
Destroy(this.gameObject);
InventoryManager.Instance.AddItem(itemSO);
}
}