ShootGame1(人物的移动和动画、相机的跟随)

人物的移动:用刚体控制移动

声明角色移动的速度和刚体组件,用MovePosition()
让物体移动到新的位置position,恒速移动适用于频繁改变,推荐使用这种,较为平滑

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

public class Player : MonoBehaviour
{
    public float speed=6;//主角移动速度
    private Rigidbody rb;//刚体组件
    private float camLeagth = 100;//射线的长度
    private LayerMask floorMask;//地面的层级数
    //private int floorMask;
    private Animator anim;

    private void Awake()
    {
        
    }
    void Start()
    {
        rb = GetComponent<Rigidbody>();//获取刚体组件
        //floorMask =LayerMask.NameToLayer("Floor");
        floorMask = LayerMask.GetMask("Floor");
        anim = GetComponent<Animator>();//获取动画组件
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    private void FixedUpdate()
    {
        PlayerMove();
        Turn();
    }
    //移动
    public void PlayerMove()
    {
       
        //左右移动
        float horizontal = Input.GetAxis("Horizontal");
        //前后移动
        float vertical = Input.GetAxis("Vertical");
        Vector3 movement = new Vector3(horizontal, 0, vertical);
       
        if(horizontal!=0||vertical!=0)
        {
            rb.MovePosition(transform.position + movement.normalized * speed * Time.deltaTime);
            anim.SetBool("moveing", true);//播放move动画
        }
        else 
        {
            anim.SetBool("moveing", false);//播放idle动画
        }
        //不用刚体控制移动
        //if(Input.GetKey(KeyCode.W))
        //{
        //    transform.Translate(Vector3.forward);
        //}


    }
    //射线控制角色旋转的方向
    public void Turn()
    {
        //从主摄像机的原点向鼠标的位置上发送一条射线
        Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        //如果射线检测成功
        if(Physics.Raycast(camRay,out hit,camLeagth,floorMask))
        {
            Debug.Log("射线");
            //根据鼠标位置进行转向
            Vector3 playerMouse = hit.point - transform.position;//向量计算
            rb.MoveRotation(Quaternion.LookRotation(playerMouse));
            //
            //transform.LookAt(hit.point);
        }
    }
}
 

相机的跟随:用Unity平滑函数Lerp

lerp主要有三个参数(常用)

lerp(初始状态 , 目标状态, OneExecutePer )

OneExecutePer:每一次执行靠近的度是多少(如果是1,就是说执行一次就会达到目标)

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

public class CameraMove : MonoBehaviour
{
    public Transform player;//主角
    Vector3 pos;
    private float smooth=3;//平滑值
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        pos.x = player.position.x + 1;
        pos.y = player.position.y + 5;
        pos.z = player.position.z - 5;
        //transform.position = pos;//没有平滑
        transform.position = Vector3.Lerp(transform.position, pos, smooth * Time.deltaTime);
    }
}
 

猜你喜欢

转载自blog.csdn.net/qq_57388481/article/details/127460330