Unity 鼠标点击地面移动

效果

请添加图片描述

分析

在这里我们需要用到的知识点有

  1. AI(地面烘焙,自动寻路)
  2. 射线检测

具体流程

首先我们需要创建一个地面Plane
在这里插入图片描述
创建好之后在右侧Inspector面板中把Navigation Static勾选上
因为在后面导航烘焙中需要静态才可以烘焙,所以我们需要把地面设置为导航静态
在这里插入图片描述
设置好之后点击Window/AI/Navigation
在这里插入图片描述
点击之后就会出现这么一个面板
在这里插入图片描述
我们选择Bake
在这里插入图片描述
然后点击下面的Bake开始烘焙
在这里插入图片描述
烘焙完之后我们发现,边缘的一些地方我们还没有烘焙到
怎么解决呢
我们发现了Agent Radius这个属性
Agent Radius : 这个属性可以调整距离边缘远近的问题我们之前是0.5f,现在把他调成0.1f
在这里插入图片描述
然后我们再次点击Bake烘焙
在这里插入图片描述
我们发现这次比之前烘焙面积大了很多
接下来我们就开始创建一个Cube开始寻路
在这里插入图片描述
我们给创建好的Cube添加一个Nav Mesh Agent组件
这个组件就是用来寻路用的,具体详情大家可以查看unity官方文档
链接: Nav Mesh Agent 文档.
下面我们就开始写代码

using UnityEngine;
using UnityEngine.AI;

public class Move : MonoBehaviour
{
    NavMeshAgent agent;
    Camera cam;
    // Start is called before the first frame update
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();//获取cube中的NavMeshAgent组件
        cam = Camera.main;//取到相机
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetMouseButtonDown(0))//当鼠标左键按下的时候
        {
            Ray ray=cam.ScreenPointToRay(Input.mousePosition);//从当前点击的位置发射一条射线
            if(Physics.Raycast(ray,out RaycastHit hit))//判断当前射线有没有射中物体
            {
                if(hit.transform.CompareTag("Ground"))//判断射中的物体是不是地面
                {
                    //是的话我们就让cube移动过去
                    agent.SetDestination(hit.point);//设置目标点
                }
            }
        }
    }
}

在代码中我们判断了射中的物体是否是地面,他的tagGround刚刚没有设置,在这里我们重新设置一下
选中Plane
在这里插入图片描述
点击AddTag
在这里插入图片描述
然后我们编辑一个Ground保存就好啦
保存之后我们就可以在tag列表中看到这个tag
然后我们选中他就可以啦!!!(注意,选中的tag一定要和代码里面的tag一模一样)
在这里插入图片描述
好啦在这里本篇文章就结束啦,喜欢的小伙伴麻烦点个赞哦!!!每一个赞都是博主写文章最大的动力,谢谢大家!
(文章中出现的射线检测如果有不会的请大家关注博主,在后期博主会专门写一篇关于射线检测的文章哦)

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,下面是一个基本的Unity3D点选地面控制人物移动的示例代码: ``` using UnityEngine; public class PlayerController : MonoBehaviour { public float speed = 10f; // 移动速度 private Rigidbody rb; // 刚体组件 private Vector3 movement; // 移动方向 // 初始化,获取刚体组件 void Start() { rb = GetComponent<Rigidbody>(); } // 每帧更新 void FixedUpdate() { // 获取鼠标点击地面的位置 if (Input.GetMouseButton(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { // 计算移动方向 movement = (hit.point - transform.position).normalized; } } // 移动人物 rb.MovePosition(transform.position + movement * speed * Time.fixedDeltaTime); } } ``` 这个脚本会获取鼠标点击地面的位置,然后计算出人物需要移动的方向,并通过刚体组件移动人物。您可以根据自己的需要进行修改和扩展。 ### 回答2: 下面是一个基本的Unity3D代码段,用于在点击地面时控制人物移动到目标位置。 ```csharp using UnityEngine; public class PlayerMovement : MonoBehaviour { private Rigidbody playerRigidbody; // 玩家刚体组件 private bool isMoving; // 是否正在移动 private void Start() { playerRigidbody = GetComponent<Rigidbody>(); } private void Update() { if (Input.GetMouseButtonDown(0)) // 鼠标左键点击 { RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit)) // 发出射线检测到地形 { MoveToDestination(hit.point); } } } private void MoveToDestination(Vector3 destination) { isMoving = true; playerRigidbody.MovePosition(destination); } } ``` 以上代码中,`PlayerMovement`类用于控制玩家角色的移动。在`Start`函数中,获取玩家的刚体组件。在`Update`函数中,如果鼠标左键被点击,发出一条射线从摄像机射向鼠标点击的位置。如果射线检测到地面(或其他可点击的层),则调用`MoveToDestination`函数,将角色移动点击位置。 `MoveToDestination`函数将`isMoving`标记为`true`表示角色正在移动,并使用`MovePosition`方法直接将玩家刚体移动到目标位置。 ### 回答3: 在Unity3D中点击地面控制人物的代码可以使用Raycast来实现。以下是一个简单的示例代码: ```csharp using UnityEngine; public class ClickToMove : MonoBehaviour { public float speed = 5f; // 人物移动速度 private CharacterController characterController; // 人物控制器 private void Start() { characterController = GetComponent<CharacterController>(); } private void Update() { if (Input.GetMouseButtonDown(0)) // 当左键点击时 { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 创建一条从相机到鼠标位置的射线 RaycastHit hit; if (Physics.Raycast(ray, out hit)) // 将射线投射到场景中 { // 如果射线碰到地面 if (hit.collider.CompareTag("Ground")) { // 获取射线碰撞点位置 Vector3 targetPosition = new Vector3(hit.point.x, transform.position.y, hit.point.z); // 计算人物的移动方向和距离 Vector3 moveDirection = targetPosition - transform.position; float distance = Vector3.Distance(transform.position, targetPosition); // 设置人物朝向 transform.LookAt(targetPosition); // 移动人物 characterController.Move(moveDirection.normalized * speed * Time.deltaTime); } } } } } ``` 以上代码中,我们创建了一个名为`ClickToMove`的脚本,将其挂载到主角物体上。当我们点击地面时,射线将会从相机位置发射到鼠标点击的地点,并将其射线碰撞到的位置设置为主角需要移动到的目标位置。然后,我们计算了主角的移动方向和距离,并将其朝向目标位置,最后根据移动方向和速度移动主角。请注意,在场景中需要有一个被标记为"Ground"的地面对象,以便射线可以正确碰撞到地面上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不敲注释的呆呆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值