摄像机跟随

 摄像机跟随思路:
 一、距离跟随(摄像机与人物始终保持固定的距离)
 二、角度跟随(当人物旋转时,摄像机也跟随者旋转)
 三、障碍物跳跃(当遇到障碍物时,寻求最佳位置)
 private Transform player;
    private Vector3 offest;   //摄像机和人物相对位置
    private float distance;
    private Vector3[] points = new Vector3[5];

    private Vector3 targetpos;

     void Awake()
    {
        player = GameObject.FindWithTag("Player").transform;
        offest = transform.position - player.position;
        //计算向量的长度
        distance = offest.magnitude;
    }

    void FixedUpdate()
    {
        //此点为最初位置
        points[0] = player.position + offest;
        //此点为人物最上方位置
        points[4] = player.position + Vector3.up * distance;

        //下方四点为最初及最上方点之间的位置
        points[1] = Vector3.Lerp(points[0], points[4], 0.25f);
        points[2] = Vector3.Lerp(points[0], points[4], 0.5f);
        points[3] = Vector3.Lerp(points[0], points[4], 0.75f);
        points[4] = Vector3.Lerp(points[0], points[4], 0.9f);

        //摄像机的最佳点位置
        targetpos = FindCameraTarget();
        //摄像机跟随实现
        AdjustCamera();
    }

    //获取最适宜的摄像机点(5个点中选一个)
    private Vector3 FindCameraTarget()
    {
        Vector3 result = points[points.Length - 1];
        //依次遍历,看哪个点最先返回正确射线碰撞信息(射线碰到人物)
        for (int i = 0; i <points.Length; ++i)
        {
            if (IsHitPlayer(points[i],player.position))
            {
                result = points[i];

                break;
            }
        }

        return result;
    }


    //检测是否碰到人物
    private Ray ray;
    private RaycastHit hit;

    bool IsHitPlayer(Vector3 origin, Vector3 target)  
    {
        bool result = false;
        //获取射线距离
        Vector3 dir = target - origin;
       //实例化一个射线对象
        ray = new Ray(origin, dir);
        //检测射线碰撞
        if (Physics.Raycast(ray,out hit))
        {
            if (hit.transform.tag == "Player")
            {
                result = true;
            }

        }

        return result;
    }

    //调整摄像机
    void AdjustCamera ()
    {
        //距离跟随
        transform.position = Vector3.Lerp(transform.position, targetpos, Time.deltaTime * 6);
        //角度跟随
        Quaternion rotation = Quaternion.LookRotation(player.position - transform.position);
        transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * 33f);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值