Unity中设置相机跟随

本文介绍了在Unity中实现相机跟随角色的原理,通过向人物发射射线,判断相机与人物正上方位置的5个差值。当射线未检测到人物时,调整相机的位置和角度,确保角色始终在相机视野内。
摘要由CSDN通过智能技术生成

原理是相机朝人物发射一条射线,设置相机和人物正上方位置之间5个差值 当射线检测不到人物时,相机变换位置并旋转角度

public class CameraMove : MonoBehaviour {

    public float moveSpeed;
    private Transform player;
    Vector3 direction;      //摄像机指向玩家的向量
    RaycastHit hit;
    float distance;         //摄像机与人之间的距离
    private Vector3[] viewPoints;      //摄像机对着Playerd发射线的观察点
    public float turnSpeed;                //摄像机达到观察点后旋转的速度

	void Start () {
        player = GameObject.FindWithTag(Tags.Player).transform;
        viewPoints = new Vector3[5];
        distance = Vector3.Distance(transform.position, player.position);
        direction = player.position - transform.position;
	}


    private void LateUpdate()
    {
        Vector3 startPos = player.position - direction;             //第一个观察点
        viewPoints[0] = startPos;
        Vector3 endPos = player.position + Vector3.up * distance;  //第五个观察点
        viewPoints[4] = endPos;

        viewPoints[1] = Vector3.Lerp(startPos, endPos, 0.25f);
        viewPoints[2] = Vector3.Lerp(startPos, endPos, 0.5f);
        viewPoints[3] = Vector3.Lerp(startPos, endPos, 0.75f);
        Vector3 tempViewPoint = viewPoints[0];


        for (int i = 0; i < viewPoints.Length; i++)
        {
            if (CheckView(viewPoints[i]))   //如果能看到玩家
            {
                
                tempViewPoint = viewPoints[i];  //保存改坐标
                break;
            }

        }
        //把相机移动到观察点上
        transform.position = Vector3.Lerp(transform.position, tempViewPoint, Time.deltaTime * moveSpeed);

        //沿着X轴进行旋转
        SmoothRotate();

    }
    /// <summary>
    /// 检测摄像机在所指定的点pos处能否看得到玩家
    /// </summary>
    /// <param name="pos"></param>
    /// <returns></returns>
    bool CheckView(Vector3 pos)
    {
        Vector3 dir = player.position - pos;
        //沿着
        if (Physics.Raycast(pos,dir,out hit))
        {
            if (hit.collider.tag==Tags.Player)
            {
                return true;
            }     
        }
        return false;
       //Ray ray= Camera.main.ScreenPointToRay(player.position);

        
    }
    void SmoothRotate()
    {
        //1.得到要旋转到的目标方向向量
        Vector3 dir = player.position - transform.position;
        
        //2.得到要旋转的角度(四元数)
        Quaternion q = Quaternion.LookRotation(dir);

        //3,使用差值,让摄像机又快到慢旋转
        transform.rotation = Quaternion.Lerp(transform.rotation, q, Time.deltaTime * turnSpeed);
        // 只让X轴旋转 把其他两个方向的角度归零
        transform.eulerAngles = new Vector3(transform.eulerAngles.x, 0, 0);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值