重要提示:我知道我可以创建一个空的游戏对象,将其作为孩子的门并旋转此枢轴点。但我希望通过代码来实现。
所以我在Unity中有一个可旋转的门。我通过代码创建一个pivotpoint并尝试旋转它。门相对于其父门旋转。
[SerializeField]
private Vector3 targetRotation; // rotation angles
[SerializeField]
private float duration; // rotation speed
[SerializeField]
private bool closeAgain; // close the door again?
[SerializeField]
private float waitInterval; // close the door after x seconds
private Vector3 defaultRotation; // store the rotation when starting the game
private bool isActive = false;
Transform doorPivot; // the pivot point to rotate around
private void Start()
{
doorPivot = new GameObject().transform; // create pivot
transform.SetParent(doorPivot); // make the door being a child of the pivot
defaultRotation = doorPivot.eulerAngles;
}
private IEnumerator DoorRotation()
{
if (isActive)
yield break;
isActive = true;
yield return StartCoroutine(RotateDoor(doorPivot.eulerAngles + targetRotation)); // open the door
if (!closeAgain)
Destroy(this); // destroy the script if the door should stay open
yield return new WaitForSeconds(waitInterval); // wait before closing
yield return StartCoroutine(RotateDoor(defaultRotation)); // close the door
isActive = false;
}
private IEnumerator RotateDoor(Vector3 newRotation) // door rotation
{
float counter = 0;
Vector3 defaultAngles = doorPivot.eulerAngles;
while (counter < duration)
{
counter += Time.deltaTime;
doorPivot.eulerAngles = Vector3.Lerp(defaultAngles, newRotation, counter / duration);
yield return null;
}
}
public void Interact() // start the rotation
{
StartCoroutine(DoorRotation());
}
开始游戏时,我调用方法Interact()
,门开始旋转。
枢轴点在(0,0,0)处创建,因此当将门放置得更靠近此点时,旋转会变得更好。如果门很远,旋转就是一个大圆圈。
所以我想把枢轴总是靠近门。然后,门被移走了,因为它是枢轴的孩子。
我会为检查员创建一个新字段
[SerializeField]
Vector3 pivotPosition; // position of the pivotpoint
此字段应表示相对于门的枢轴位置。
例如
用户可以自行选择放置枢轴点的位置,但放置时,门不应移开。
有人可以帮助我吗?
答案 0 :(得分:0)
@Chuck Savage解决了这个问题
[SerializeField]
private Vector3 pivotPosition;
private Vector3 defaultRotation;
Transform doorPivot;
private void Start()
{
doorPivot = new GameObject().transform;
doorPivot.position = pivotPosition; // place the pivot before parenting!
transform.SetParent(doorPivot);
defaultRotation = doorPivot.eulerAngles;
}
在开始教养之前,只需设置枢轴位置。