如果A物体不是B物体的子物体,能不能让A物体像B的子物体一样一直保持相同的相对的位置和朝向呢?
这里给出了一个目前我认为可能是最合适的方法。
首先说位置的保持方法。先创建一个偏移变量,例如posOffset,这个变量用来记录初始时A物体相对于B物体空间坐标的位置,可以先在Start()方法里面获取这个变量的值:
posOffset = B.transform.InvertTransformPoint(A.transform.position);
然后在LateUpdate()里面写保持这个相对位置的代码:
A.transform.position = B.transform.TransformPoint(posOffset);
然后再说朝向的保持方法。这里需要创建两个变量,分别是forwardOffset和upOffset,用于记录A物体以B物体为参照的系的前方和上方。可以先在Start()方法里面获取这两个变量的值:
forwardOffset = B.transform.InvertTransformVector(A.transform.forward);
upOffset = B.transform.InvertTransformVector(A.transform.up);
然后在LateUpdate()里面写保持这个相对朝向的代码:
Vector3 forward = B.transform.TransformVector(forwardOffset );
Vector3 lookAtPoint = A.transform.position + forward;
Vector3 up = B.transform.TransformVector(upOffset );
A.transform.LookAt(lookAtPoint ,up);
这里写一个样例代码,如下:
using UnityEngine;
public class TranFollow : MonoBehaviour
{
[SerializeField]
Transform target;
[SerializeField]
bool useOffset = false;
[SerializeField]
Vector3 posOffset = Vector3.zero;
[SerializeField]
Vector3 forwardOffset = Vector3.zero;
[SerializeField]
Vector3 upOffset = Vector3.zero;
void Start()
{
GetOffset();
}
void LateUpdate()
{
if (useOffset)
{
transform.position = target.TransformPoint(posOffset);
//
Vector3 forward = target.TransformVector(forwardOffset);
Vector3 lookAtPoint = transform.position + forward;
Vector3 up = target.TransformVector(upOffset);
transform.LookAt(lookAtPoint, up);
}
else
{
transform.position = target.position;
transform.rotation = target.rotation;
}
}
void OnValidate()
{
GetOffset();
}
void GetOffset()
{
if (useOffset)
{
posOffset = target.InverseTransformPoint(transform.position);
//
forwardOffset = target.InverseTransformVector(transform.forward);
upOffset = target.InverseTransformVector(transform.up);
}
}
}