主摄像机的z轴默认和人物之间的距离不变

主摄像机的z轴默认和人物之间的距离不变

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class cameraFollowScript : MonoBehaviour
{
    public Transform target;
    public float smooth;  //0-1
    private Vector3 offset;
    // Start is called before the first frame update
    void Start()
    {
        offset = target.position - this.transform.position;
    }
}

关于这个偏移,实际上是保持了相机初始位置和角色之间的距离不变游戏运营,而不是相机一定要把角色放在中间。

请注意3D素材,该脚本是针对空对象的脚本。 最后,必须先重置空物体的位置,然后将主相机放置在该物体下方,成为子物体。

原因是主摄像头的z轴默认为-10,与精灵有一定的距离,这样才能捕捉到图片。 如果直接获取精灵的位置并赋值给主相机,z就会变成0,精灵就会粘在一起,无法拍摄。 将主相机更改为空物体的子物体,这样主相机与空物体的相对距离始终为-10。

当然,您不必这样做。 那么代码中就不需要直接赋值精灵的位置,而只赋值x和y,z我们自己写。

示例↓

transform.position = new Vector3(player_tansform.position.x, player_tansform.position.y, transform.position.z);

稍后更新:

unity摄像机跟随角色视野_unity 摄像机跟随物体_unity摄像头跟随

前提条件判断:

void LateUpdate()
    {
        if (target != null)
        {
            if (transform.position != target.position)
            {
                //do something
            }
        }
    }

我听说 LateUpdate 这样更好。 角色先移动,摄像机随后移动。

第一层判断目标elf是否存在,否则会报错。

unity摄像头跟随_unity 摄像机跟随物体_unity摄像机跟随角色视野

第二层判断位置是否相等。 如果它们相等,则不要移动。 但我认为这里没有必要。 当我实际尝试时,相机并不总是与对象精灵的位置完全一致。 它始终是十进制数 0.99,所以我认为没有必要。 必要的

写法一:Lerp

Vector3 targetPos = target.position;
transform.position = Vector3.Lerp(transform.position, targetPos, smooth); 

位置 = a + (ba)*c

unity摄像头跟随_unity摄像机跟随角色视野_unity 摄像机跟随物体

所以如果smoothunity 摄像机跟随物体,即c等于1,其实就是隐形传送。

如果c等于0,相机不移动

如果c等于0.5unity 摄像机跟随物体,那么每次执行该方法时,相机都会来到两者的中点。

据说这样特别流畅,还可以实现延迟摄像跟踪的功能。 然而,我有一个形而上学的错误。 物体一个接一个地被卡住。 我怀疑是电脑问题。 我稍后再尝试。

unity摄像头跟随_unity摄像机跟随角色视野_unity 摄像机跟随物体

写法二:位置

直接传送

this.transform.position = target.position - offset;

这是带有偏移的直接传送版本,初始位置的相对距离保持不变。

文章来源:https://zhuanlan.zhihu.com/p/419897864