Unity3D 摄像机平滑跟随角色

摄像机跟随主角移动有多种方式,第一人称视角的话摄像机保持和主角一直的位置和朝向,并增加一些平滑移动即可。第三人称的(包括越肩和斜45读视角),就复杂一些,因为有时候会导致摄像机和主角之间有东西挡着,照不到主角。
这种情况可以用射线来判断和主角之间是否有遮挡物,并设置多个位置,便利寻找不会被遮挡的位置。

以下是官方示例中的跟随例子:

    void Awake() {
        player = GameObject.FindGameObjectWithTag(Tags.player).transform;
        offset = transform.position - player.position;
        offset = new Vector3(0, offset.y, offset.z);
    }

    void UpdateCamePos () {
        Vector3 beginPos = player.position + offset;
        Vector3 endPos = player.position + offset.magnitude * Vector3.up;
        Vector3 pos1 = Vector3.Lerp(beginPos, endPos, 0.25f);
        Vector3 pos2 = Vector3.Lerp(beginPos, endPos, 0.5f);
        Vector3 pos3 = Vector3.Lerp(beginPos, endPos, 0.75f);
        Vector3[] posArray = new Vector3[] { beginPos, pos1, pos2, pos3, endPos };

        Vector3 targetPos = posArray[0];
        for (int i = 0; i < 5; i++) {
            RaycastHit hitinfo;
            if (Physics.Raycast(posArray[i], player.position - posArray[i], out hitinfo)) {
                if (hitinfo.collider.tag != Tags.player) {
                    continue;
                } else {
                    targetPos = posArray[i];
                    break;
                }
            } else {
                targetPos = posArray[i];
                break;
            }
        }

这个函数在Update()中调用,可以更新摄像机的位置。这里的offset 即使初始情况下摄像机和主角的位置差,是在编辑场景的时候调整的。

这里写图片描述

这是平滑移动摄像机朝向,对准主角的函数,同样在Update()中调用。
第三人称越肩视角和上面的方法类似,不过endPos 应该是离主角更近的位置而不是取主角的正上方,效果就是在一些射击游戏中,当玩家背靠墙的时候摄像机会离主角很近,而不会在墙的后面。

你可能感兴趣的:(unity3d)