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);
稍后更新:
前提条件判断:
void LateUpdate()
{
if (target != null)
{
if (transform.position != target.position)
{
//do something
}
}
}
我听说 LateUpdate 这样更好。 角色先移动,摄像机随后移动。
第一层判断目标elf是否存在,否则会报错。
第二层判断位置是否相等。 如果它们相等,则不要移动。 但我认为这里没有必要。 当我实际尝试时,相机并不总是与对象精灵的位置完全一致。 它始终是十进制数 0.99,所以我认为没有必要。 必要的
写法一:Lerp
Vector3 targetPos = target.position;
transform.position = Vector3.Lerp(transform.position, targetPos, smooth);
位置 = a + (ba)*c
所以如果smoothunity 摄像机跟随物体,即c等于1,其实就是隐形传送。
如果c等于0,相机不移动
如果c等于0.5unity 摄像机跟随物体,那么每次执行该方法时,相机都会来到两者的中点。
据说这样特别流畅,还可以实现延迟摄像跟踪的功能。 然而,我有一个形而上学的错误。 物体一个接一个地被卡住。 我怀疑是电脑问题。 我稍后再尝试。
写法二:位置
直接传送
this.transform.position = target.position - offset;
这是带有偏移的直接传送版本,初始位置的相对距离保持不变。