Unity实现点击地面控制人物移动

首先声明,博主使用的是Unity5.3.2(64)

最近几篇关于Unity的博客是博主学习了一个RPG游戏后把一部分功能摘出来做的一个总结,这篇是关于人物移动的。


废话不多说:

using UnityEngine;
using System.Collections;

public class PlayerDirection : MonoBehaviour {

    public Vector3 targetPosition = Vector3.zero;//用来保存目标位置
    private bool isMoving = false;//用来判断是否鼠标移动
    private PlayerMove move;//用来执行移动的脚本

    // Use this for initialization
    void Start () {
        targetPosition = transform.position;//初始化目标位置
        move = GetComponent<PlayerMove> ();//获取人物的移动脚本
    }

    // Update is called once per frame
    void Update () {
        if (Input.GetMouseButtonDown (0)) {
            Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);//从相机向鼠标点击点发射条射线
            RaycastHit hit;//记录碰撞信息
            bool isCollider = Physics.Raycast (ray,out hit);//判断是否发生碰撞
            if (isCollider && hit.collider.tag == Tags.ground) {//f发生碰撞,并且是地面
                isMoving = true;
                LookAtTarget (hit.point);//使物体朝向目标点
            }
        }
        if (Input.GetMouseButtonUp (0)) {
            isMoving = false;
        }
        if (isMoving) {
            //得到要移动的目标位置
            //让主角朝向目标位置
            Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
            RaycastHit hit;
            bool isCollider = Physics.Raycast (ray, out hit);
            if (isCollider && hit.collider.tag == Tags.ground) {
                LookAtTarget (hit.point);
            }

        } else {
            if (move.isMove) {
                LookAtTarget (targetPosition);
            }
        }
    }

    void LookAtTarget(Vector3 hitPoint){ 
        targetPosition = hitPoint;
        targetPosition = new Vector3(targetPosition.x,transform.position.y,targetPosition.z);
        this.transform.LookAt (targetPosition);
    }
}
using UnityEngine;
using System.Collections;
public class PlayerMove : MonoBehaviour {

    public float speed = 4;//移动速度
    public bool isMove = false;//判读是否在移动中

    private PlayerDirection dir;//用来实现点击地面的脚本
    private CharacterController controller;//角色控制器
    // Use this for initialization
    void Start () {
        dir = GetComponent<PlayerDirection> ();
        controller = GetComponent<CharacterController> ();
    }

    // Update is called once per frame
    void Update () {
    //获得与目标点的距离
            float distance = Vector3.Distance (dir.targetPosition, transform.position);
            //距目标点的距离大于0.2才移动
            if (distance > 0.2f) {
                isMove = true;
                controller.SimpleMove (transform.forward * speed);
            } else {
                isMove = false;
            }
        }
    }

    public void SimpleMove(Vector3 targetPos){
        transform.LookAt (targetPos);//朝向目标点
        controller.SimpleMove (transform.forward * speed);//移动
    }
}
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答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"的地面对象,以便射线可以正确碰撞到地面上。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值