不建立父子关系却像父子关系一样保持相同的相对的位置和朝向的方法

36 篇文章 1 订阅

        如果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);
		}
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值