unity中关于鼠标点击人物朝向和移动的简单做法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerDir : MonoBehaviour
{
    public GameObject effect_click_prefab;
    public Vector3 targetPoisition = Vector3.zero;
    private PlayerMove playerMove;
    private bool isMoving = false;//表示鼠标是否按下



    private void Start()
    {
        targetPoisition = transform.position;
        playerMove = GetComponent<PlayerMove>();
    }
    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            //将鼠标点击的点转化为射线
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //保存碰撞信息
            RaycastHit hitInfo;
            //使用射线检测表示是否碰撞到什么东西

            bool isCollider = Physics.Raycast(ray, out hitInfo);
            //记得将地面标签设置为ground
            if (isCollider && hitInfo.collider.tag == Tags.ground)
            {
                isMoving = true;
                ShowClickEffect(hitInfo.point);
                //未移动时 点击立马朝向目标位置转向
                LookAtTarget(hitInfo.point);
            }
        }
            if(Input.GetMouseButtonUp(0))
            {
                isMoving = false;
            }
            //移动过程中一点击就会立马朝向目标位置
            if (isMoving)
            {
                //得到要移动的目标位置
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                //保存碰撞信息
                RaycastHit hitInfo;
                //使用射线检测表示是否碰撞到什么东西
                bool isCollider = Physics.Raycast(ray, out hitInfo);
                if (isCollider && hitInfo.collider.tag == Tags.ground)
                {
                    LookAtTarget(hitInfo.point);

                }
                
            }
        else
        {
            //鼠标抬起后  根据是否移动判断方向
            //当在移动过程中  人物一直更新朝向(解决因为碰撞导致的人物方向不一致的问题 朝向改变将会一直走)
            if (playerMove.isMoving)
            {
                LookAtTarget(targetPoisition);
            }
        }

    }
    //实例化出来点击的效果
    void ShowClickEffect(Vector3 hitPoint)
    {
        //将点击的位置向上提高0.1 将点击特效显示
        hitPoint = new Vector3(hitPoint.x, hitPoint.y+0.1f, hitPoint.z);
        GameObject.Instantiate(effect_click_prefab,hitPoint,Quaternion.identity);
    }
    //主角朝向目标位置的方法
    void LookAtTarget(Vector3 hitPoint)
    {
        targetPoisition = hitPoint;
        //只在y轴旋转
        targetPoisition = new Vector3(targetPoisition.x,transform.position.y, targetPoisition.z);
        this.transform.LookAt(targetPoisition);
    }
}

上方这段代码用于鼠标点击更改人物朝向问题

挂载在人物物体上   注意将点击特效赋值和点击的地面的tag标签设置为ground

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public enum ControlWalkState
{ 
    Moving,
    Idle
}


public class PlayerMove : MonoBehaviour
{
    public float speed = 4;
    public ControlWalkState state = ControlWalkState.Idle;
    public bool isMoving = false;//更新朝向

    private PlayerDir dir;
    private CharacterController controller;



    void Start()
    {
        dir = this.GetComponent<PlayerDir>();
        controller = this.GetComponent<CharacterController>();

    }

    // Update is called once per frame
    void Update()
    {
       
            float distance = Vector3.Distance(dir.targetPoisition, transform.position);
            if (distance > 0.3f)
            {
                isMoving = true;
                state = ControlWalkState.Moving;
                //CharacterController中的方法
                controller.SimpleMove(transform.forward * speed);
            }
            else
            {
                isMoving = false;
                state = ControlWalkState.Idle;
            }
        
    }

    //主角移向目标位置
    public void SimpleMove(Vector3 targetPos)
    {
        transform.LookAt(targetPos);
        controller.SimpleMove(transform.forward * speed);
    }


}

此段代码用于控制人物移动的效果  也将其挂载在主角物体身上  注意在人物物体上挂载CharacterController组件  并设置其参数将人物主角包裹

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值