欢迎光临散文网 会员登陆 & 注册

[Blender+Unity]鼠标交互寻路Demo

2023-04-01 23:16 作者:TripleKilo  | 我要投稿

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.AI;


public class PlayerMovement : MonoBehaviour

{

  public MouseAction mouseAction;

  void Start()

  {

    //启动时把自己的函数放入事件的委托列表

    //类外的事件触发时类内的函数触发

    mouseAction.OnMouseClickOnMap += MouseAction_OnMouseClickOnMap;

  }

  //接受到事件后触发函数

  private void MouseAction_OnMouseClickOnMap(object sender, MouseAction.OnMouseClickOnMapEventArgs e)

  {

    //获取导航组件

    if (TryGetComponent<NavMeshAgent>(out NavMeshAgent agent))

    {

      //根据事件传来的位置信息给导航组件设定目标

      agent.SetDestination(e.targetPosition);

    }

  }

}


using System;

using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class MouseAction : MonoBehaviour

{

  //定义一个向外传递信息的事件,发出的信息是自定义的EventArgs,

  //向所有符合条件(无返回值,传两个参数)且加入了接受列表的函数发出信息

  //类内触发事件,类外同步触发其他类的函数

  public event EventHandler<OnMouseClickOnMapEventArgs> OnMouseClickOnMap;

  //自定义一种数据包装类型,包裹一个位置信息,再创建时装入位置信息 

  public class OnMouseClickOnMapEventArgs : EventArgs

  {

    public Vector3 targetPosition;

    public OnMouseClickOnMapEventArgs(Vector3 targetPosition)

    {

      this.targetPosition = targetPosition;

    }

  }





  void Update()

  {

    //如果鼠标按下

    if (Input.GetMouseButtonDown(0))

    {

      //创建碰撞检测射线

      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

      //如果碰撞检测成功,鼠标有点击在物体上

      if (Physics.Raycast(ray, out RaycastHit hit))

      {

        //判断碰撞物体是不是地图

        if (hit.collider.gameObject.tag == "Map")

        {

          Debug.Log(hit.point);


          //触发事件

          OnMouseClickOnMap?.Invoke(this, new OnMouseClickOnMapEventArgs(hit.point));

        }


      }

    }

  }

}


using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class CameraFollow : MonoBehaviour

{

  public Transform player;

  public Vector3 offset;


  //相机和目标物体间位置相差一个偏差值

  void Update()

  {

    transform.position = player.position + offset;

  }

}

[Blender+Unity]鼠标交互寻路Demo的评论 (共 条)

分享到微博请遵守国家法律