【问题标题】:Building a rotating platform in Unity在 Unity 中构建旋转平台
【发布时间】:2017-08-26 04:35:40
【问题描述】:

我有一个平台,它围绕轴旋转并保持玩家随之旋转。

一开始,我做了一个平台绕y轴旋转

[SerializeField]
bool counterclockwise; // rotation left or right?

[SerializeField]
private int speed;

private void Start()
{
    if (counterclockwise)
        speed = -speed;
}

private void Update()
{
    transform.Rotate(new Vector3(0, speed * Time.deltaTime, 0));
}

private void OnTriggerEnter(Collider col)
{
    col.transform.parent = transform; // keep the player as a child, to rotate him with the platform rotation
}

private void OnTriggerExit(Collider col)
{
    col.transform.parent = null; // remove the player as a child
}

这真的很棒。所以当试图在 x 轴或 z 轴上旋转平台时,会出现一些错误。

当玩家得到一个平台的孩子(在 x 轴或 z 轴上旋转时)他变得非常大,物理崩溃,他自动飞到没有重力的空中,...

有人可以帮我解决这个错误吗?

所以当前的代码是

[SerializeField]
Vector3 rotationVector;

private void Update()
{
    transform.Rotate(rotationVector * Time.deltaTime);
}

private void OnTriggerEnter(Collider col)
{
    col.transform.parent = transform;
}

private void OnTriggerExit(Collider col)
{
    col.transform.parent = null;
}

【问题讨论】:

  • 您的播放器对象的比例是否统一? X:1 Y:1 Z:1 ?
  • 平台的孩子有rigidbody2D和collider2D吗?
  • @EmreE 是的,目前玩家有这个比例
  • @HieuNguyenTrung 是的,我的播放器连接了一个刚体。但这是一个 3D 游戏。
  • @Question3r 我无法确认差异 rn,但你可以试试这样col.gameObject.transform.SetParent(transform);

标签: c# unity3d rotation


【解决方案1】:

显然,当您将Parent设置为GameObject时会出现问题,与triger enter或rotation无关,而导致此问题的原因似乎是以下组合:

  • 父对象上的非均匀缩放。
  • 对您的子对象进行任意旋转

我对两者都做了几次实验:

character.transform.parent = this.transform;

character.transform.SetParent(this.transform);

问题仍然存在。

我通过创建一个空游戏对象解决了这个问题,将它放在平台的中间(您可以对此进行编程或使用编辑器)。然后我创建了一个脚本来制作这个空游戏对象的子平台和角色。还需要在此 Empty GameObject 的 update() 中执行旋转。

您可以尝试编写这个脚本,只添加一个 Start() 和 Update() 方法来测试这个解决方案:

void Start () {

    GameObject character = GameObject.FindGameObjectWithTag("character");
    GameObject platform = GameObject.FindGameObjectWithTag("platform");

    character.transform.SetParent(this.transform,false);
    platform.transform.SetParent(this.transform,false);

}

对于更新()

  private void Update()
    {
        transform.Rotate(new Vector3(0, speed * Time.deltaTime, 0));

        //transform.Rotate(new Vector3(speed * Time.deltaTime, 0,  0));

        //transform.Rotate(new Vector3(0 , 0 , speed * Time.deltaTime));
    }

经过测试,你仍然需要实现 OnTriggerEnter 的部分和其他东西,但至少你会看到 Empty GameObject 可以“链接两者”

我猜如果对于其中一个旋转您没有看到任何问题,是因为该角度的变形被隐藏了,但是如果您转动游戏对象,您可能会看到它,并且会在另一个角度旋转时被隐藏。这将取决于您的播放器和平台游戏对象的形状

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2021-07-25
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多