控制角色点击屏幕可以前后左右移动及缓慢转身

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


public class jsyidong : MonoBehaviour {
    /// <summary>
    /// 移动的目标点
    /// </summary>
    private Vector3 TargetPos = Vector3.zero;
    /// <summary>
    /// 移动速度
    /// </summary>
    [SerializeField]
    private float m_Speed = 10f;
    /// <summary>
    /// 角色控制器
    /// </summary>
    private CharacterController characterController;
    /// <summary>
    /// 定义一个转身的速度
    /// </summary>
    private float RotationSpeed = 0.2f;
    /// <summary>
    /// 定义转身的目标方向  这是一个四元数
    /// </summary>
    private Quaternion TargeQuaternion;
    /// <summary>
    /// 定义是否已经转生
    /// </summary>
    private bool RotationOver = false;
    // Use this for initialization
    void Start () {
        //查找获取组件
        characterController = GetComponentInChildren <CharacterController>();
            
            }

// Update is called once per frame
void Update () {
        //为了防止找不见的情况下进行碰撞
        if (characterController == null) return;


        //点击屏幕  输入鼠标抬起事件
if(Input.GetMouseButtonUp(0))
        {
            //射线    主摄像机      摄像机到屏幕一点     鼠标位置
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //检测光线碰撞投射信息
            RaycastHit hitInfo;
            //要进行碰撞
            if(Physics.Raycast(ray,out hitInfo))
            {
                //如果碰到地面返回一个点  在这里需要定义一个点  移动的目标点
                if (hitInfo.collider.gameObject.name.Equals("Ground", System.StringComparison.CurrentCultureIgnoreCase))
                {
                    TargetPos = hitInfo.point;
                    RotationOver = false;//当点击屏幕的时候让他变为false
                    RotationSpeed = 0;//转身速度在鼠标点击屏幕的时候让他变为0
                }
            }
        }
        //判断主角是否着地   角色控制器自带IsGrounded  如果角色不在地面能让角色瞬间着地
        if(characterController.isGrounded)
        {
            //目标点减去当前的这个点就是方向  这样就能接地面了            Y轴1000
            characterController.Move((transform.position + new Vector3(0, 1000, 0)) - transform.position);
        }
        if(TargetPos!=Vector3.zero)
        {
            if(Vector3.Distance(TargetPos,transform.position)>0.1f)//Disney两点之间的距离
            {
                //       方向       目标点减去当前坐标点
                Vector3 direction = TargetPos - transform.position;
                direction = direction.normalized;//方向归一化  就是X  Y  Z 的方向变成1 再乘以我们的速度
                direction = direction * Time.deltaTime * m_Speed;
                direction.y = 0;//同时Y轴的方向也要变为0
          
                //修改朝向
                //transform.LookAt(TargetPos);
                //transform.LookAt(new Vector3(TargetPos.x,transform.position.y,TargetPos.z));//修改朝向 x z是我们要修改的朝向 y轴不是所以y轴就取角色的点就行
                //平移
                //transform.Translate(Vector3.forward * Time.deltaTime * m_Speed);
                //让角色缓慢转身  判断是否转身
                if (!RotationOver)
                {
                    //在这可以更改转身速度
                    RotationSpeed += 0.2f;
                    //让角色缓慢转身             看旋转
                    TargeQuaternion = Quaternion.LookRotation(direction);
                    //现在让角色转身     Lerp差值         旋转角度           定义的旋转方向     平稳速度
                    transform.rotation = Quaternion.Lerp(transform.rotation, TargeQuaternion, Time.deltaTime * RotationSpeed);
                     //判断两个夹角的角度很小的话就让这个差值小于1
                    //if (Quaternion.Angle(TargeQuaternion, transform.rotation) < 1f)
                    //{
                    //    RotationSpeed = 1;//旋转速度等于1
                    //    RotationOver = true;//当角度小于1的时候就认为转生已经完成
                    //}
                    if(RotationSpeed<=1)
                    {
                        RotationSpeed += 5f * Time.deltaTime;
                        TargeQuaternion = Quaternion.Lerp(transform.rotation, TargeQuaternion, RotationSpeed);
                    }
                }
                characterController.Move(direction);
            }
        }
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值