Unity_相机灵活跟随角色移动

每日一句:慢慢改变,慢慢成长,慢慢适应,慢慢优秀

目录

角色旋转、移动类

相机跟随人物移动类


角色旋转、移动类

/*旋转刚体,位移的动画驱动移动*/

using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class PlayerMoement : MonoBehaviour

{

   

    public float turnSmooting = 15f;

    public float speedDampTime = 0.1f;

    private Animator animator;

  

    void Start()

    {

        animator = GetComponent<Animator>();

     

    }

   

    //不受帧率影响,有物理计算的时候使用,不会因为帧率影响卡帧

    private void FixedUpdate()

    {

        float h = Input.GetAxis("Horizontal");

        float v = Input.GetAxis("Vertical");

        MovementManagement(h, v);

    }

    //旋转方法,参考绝对坐标系

    void Ratating(float h, float v)//(横轴的值,纵轴的值)

    {

        //按下横轴和纵轴的键,前左、前右,后左、后右,向量,player朝向的目标向量

        Vector3 targetDir = new Vector3(h, 0, v);

        Quaternion targetRotation = Quaternion.LookRotation(targetDir);//绝对的旋转量,旋转刚体,位移的动画驱动移动

        Rigidbody rb = GetComponent<Rigidbody>();

        Quaternion newRotation = Quaternion.Lerp(rb.rotation, targetRotation, turnSmooting * Time.deltaTime);

        4(newRotation);



    }

    void MovementManagement(float h, float v)

    {      

        if (h != 0 || v != 0)//如果按先后左右键了

        {

            Ratating(h, v);

            animator.SetBool("Walk", true);//插值

        }

        else

        {

            animator.SetBool("Walk", false);

        }

    }

}

相机跟随人物移动类

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class CameraMovement : MonoBehaviour

{

    //用插值方法移动

    float smooth = 1.5f;

    Transform player;

    Vector3 playerToCamera;

    float playerToCameraMag;

    Vector3 newPos;    //计算的结果

    // Start is called before the first frame update

    void Start()

    {

        player = GameObject.FindWithTag(Tags.Player).transform;

        playerToCamera = transform.position - player.position;//a-b等到b指向a的向量

        playerToCameraMag = playerToCamera.magnitude;//计算它的模

    }

    //射线检测,看击中的是不是player

    bool ViewingPositionCheck(Vector3 checkPos)

    {

        RaycastHit hit;

        if (Physics.Raycast(checkPos, player.position - checkPos, out hit, playerToCameraMag))//检测点到plyer的方向

        {

            if(hit.transform!=player)

            {

                return false;

            }

        }

        newPos = checkPos;

        return true;

    }

    void SmoothLookAt()

    {

        Vector3 camDirction = player.position - transform.position;//摄像机指向player的向量

        Quaternion lookAtRotation = Quaternion.LookRotation(camDirction);

        //将方向转化为旋转角度:

        //传入一个方向将返回一个旋转角,当某个物体被施加这个旋转角后,这个物体的forward方向将指向传入的方向。

        transform.rotation = Quaternion.Lerp(transform.rotation, lookAtRotation, smooth * Time.deltaTime);

    }

    private void FixedUpdate()

    {

        Vector3 standardPos = player.position + playerToCamera;

        Vector3 abovePos = player.position + Vector3.up * playerToCameraMag;//0,1,0上方高度

        Vector3[] checkPoints = new Vector3[5];

        checkPoints[0] = standardPos;

        checkPoints[1] = Vector3.Lerp(standardPos, abovePos, 0.25f);

        checkPoints[2]= Vector3.Lerp(standardPos, abovePos, 0.5f);

        checkPoints[3]= Vector3.Lerp(standardPos, abovePos, 0.75f);

        checkPoints[4] = abovePos; 

        for(int i=0;i<checkPoints.Length;i++)

        {

            if(ViewingPositionCheck(checkPoints[i]))

            {

                break;//每次传过来0到4 的点,之后进行射线检测,break 出来,找到了一个合适的点,newPos里

            }

        }

        transform.position = Vector3.Lerp(transform.position, newPos, smooth * Time.deltaTime);

        SmoothLookAt();

    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值