Unity 关于点击不同物品移动并触发不同事件

关于点击不同物品触发不同事件

可以实现在界面中点击不同的物体,移动到物品附近位置,然后触发对应的事件。

首先建立一个公共管理的类:

csharp 复制代码
public class InteractionObject : MonoBehaviour
{
    private NavMeshAgent PlayerAgent;
    private bool haveinteracted=false;//用于判断方法已经调用
    public void OnClick(NavMeshAgent PlayerAgent) 
    {
        this.PlayerAgent = PlayerAgent;
        PlayerAgent.stoppingDistance = 2;//寻路停止距离
        PlayerAgent.SetDestination(transform.position);//移动到寻路点
        haveinteracted = false;

    }
    private void Update()
    {
        if (PlayerAgent != null&&haveinteracted==false&&PlayerAgent.pathPending==false)//后边是判断路径是否计算完成
        {
            if (PlayerAgent.remainingDistance <= 2)//距离目标点的距离是否小于2米
            {
                Interact();//调用Interact()方法
                haveinteracted = true;
            }
        }
    }
    protected virtual void Interact() //便于重写
    {
        print("点到了什么东西了");
    }
}

创建角色点击移动并判断点到了什么东西的脚本:

csharp 复制代码
public class PlayerRoutine : MonoBehaviour
{
    // Start is called before the first frame update
    private NavMeshAgent PlayerAgent;
    void Start()
    {
        PlayerAgent = GetComponent<NavMeshAgent>();//获取寻路组件
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))//点击鼠标左键
        {
            Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);//创建一条射线
            RaycastHit hit;
            bool isCollide = Physics.Raycast(ray, out hit);
            if (isCollide)
            {
                if (hit.collider.tag == "Ground")//假如点击物体的标签为Ground
                {
                    PlayerAgent.stoppingDistance = 0;//停止距离为0
                    PlayerAgent.SetDestination(hit.point);//移动到点击位置
                }
                else if (hit.collider.tag == "NPC") //假如点击物体的标签为NPC
                {
                    hit.collider.GetComponent<InteractionObject>().OnClick(PlayerAgent);//调用InteractionObject中的Onclick方法
                }
                else if (hit.collider.tag == "Item") 
                {
                    hit.collider.GetComponent<InteractionObject>().OnClick(PlayerAgent);
                }
            }
        }
    }
}

接下来给不同的物体写不同的事件,通过重写Interact的方法实现,比如说点到了NPC:

csharp 复制代码
public class NPCObject : InteractionObject//继承公共管理类
{
    protected override void Interact()//重写Interact方法
    {
        print("我就是NPC!");
    }
}

点到物品

csharp 复制代码
public class ItemObject : InteractionObject
{
    protected override void Interact()
    {
        print("我就是个东西!");
    }
}

最上边是一个简单的相关Demo,可以研究一下。

相关推荐
Dr.勿忘1 小时前
Unity一分钟思路---UI任务条:宝箱位置如何准确卡在百分比位置上
ui·unity·游戏程序·屏幕适配
weixin_424294672 小时前
Unity 实现 ScrollBar 值变化控制 Panel 位置的方法
unity·游戏引擎
在路上看风景16 小时前
## 2.2 状态同步
unity
霜绛18 小时前
Unity:lua热更新(一)——AB包AssetBundle、Lua语法
笔记·学习·游戏·unity·lua
霜绛18 小时前
Unity:lua热更新(二)——Lua语法(续)
笔记·学习·unity·游戏引擎·lua
yi碗汤园18 小时前
【一文了解】C#反射
开发语言·unity·c#
HahaGiver66619 小时前
Unity Shader Graph 3D 实例 - 基础的模型贴图渲染
3d·unity·游戏程序·贴图·游戏美术
HahaGiver66619 小时前
Unity Shader Graph 3D 实例 - 一个简单的3D打印效果
3d·unity·游戏引擎
AA陈超20 小时前
ASC学习笔记0004:通知相关方能力规格已被修改
c++·笔记·学习·游戏·ue5·游戏引擎·虚幻
胖胖求游戏1 天前
Unity热更新——AB包和Lua
unity·游戏引擎·lua