在Unity中设置旋转门的枢轴点

时间:2017-10-10 06:33:51

标签: c# unity3d

重要提示:我知道我可以创建一个空的游戏对象,将其作为孩子的门并旋转此枢轴点。但我希望通过代码来实现。

所以我在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

此字段应表示相对于门的枢轴位置。

例如

enter image description here

用户可以自行选择放置枢轴点的位置,但放置时,门不应移开。

有人可以帮助我吗?

1 个答案:

答案 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;
    }

在开始教养之前,只需设置枢轴位置。