【问题标题】:child transform does not move when moving the parent transform移动父变换时子变换不移动
【发布时间】:2017-08-28 01:31:03
【问题描述】:

我有一个玩家控制的平台。当移动到外边缘时,平台开始移动。外部触发器的宽度由代码计算。

所以玩家可以向任何方向移动,他只需要靠近边缘即可触发移动。

玩家连接了刚体,也连接了平台。这是我使用的平台检查员的图像

这是附上的代码

[SerializeField]
private float speed; // the movementSpeed

[SerializeField]
private float movementTriggerWidth; // width of the triggers at the outer edges

private Vector3 movementDirection = Vector3.zero;
private Rigidbody platformRigid;
private GameObject player;
private float triggerDistance; // distance from center to a trigger

private void Start()
{
    player = Globals.GetPlayerObject(); // search for the player Object in the scene
    platformRigid = GetComponent<Rigidbody>();

    triggerDistance = transform.localScale.x / 2 - movementTriggerWidth; // set the trigger distance
}

private void OnTriggerEnter(Collider col)
{
    col.transform.parent = transform; // set the player as a child of the platform
}

private void OnTriggerExit(Collider col)
{
    col.transform.parent = null; // leave the platform
}

private void OnTriggerStay(Collider col)
{
    if (col.gameObject == player) // only the player can move the platform
    {
        Vector3 playerPosition = player.transform.position;
        Vector3 platformPosition = transform.position;

        if (Vector3.Distance(playerPosition, platformPosition) > triggerDistance) // player is in outer trigger?
        {
            movementDirection = playerPosition - platformPosition; // calculate the movement direction
            platformRigid.MovePosition(transform.position + movementDirection * speed * Time.deltaTime); // move the platform
        }
    }
}

现在的问题:

在平台上跳跃时,玩家成为平台的孩子。但是当平台开始移动时,玩家不受此影响。他不会被平台感动。

我希望有人可以帮助我解决这个“小”(?)错误。

更新:

这是播放器检查器的图片

【问题讨论】:

  • 啊,好吧,所以我的平台必须不是运动的。但是当在非运动平台上跳跃时,它就会掉下来。即使“使用重力”停用。
  • 可以分享一下玩家检查员的图片吗?
  • @ZayedUpal 我更新了我的帖子,但正如上面提到的 Fiffe,我需要切换运动状态。
  • 那么如何在不处于运动状态的情况下实现运动行为?

标签: c# unity3d


【解决方案1】:

好吧,我尝试了一些,这对我来说是一个可行的解决方案。

我移除了刚体

并拿走了这段代码

[SerializeField]
private float speed;

[SerializeField]
private float movementTriggerWidth;

private Vector3 movementDirection;
private bool move = false;
private GameObject player;
private float triggerDistance;

private void Start()
{
    player = Globals.GetPlayerObject();
    triggerDistance = transform.localScale.x / 2 - movementTriggerWidth;
}

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

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

private void OnTriggerStay(Collider col)
{
    if (col.gameObject == player)
    {
        Vector3 playerPosition = player.transform.position;
        Vector3 platformPosition = transform.position;

        if (Vector3.Distance(playerPosition, platformPosition) > triggerDistance)
        {
            movementDirection = playerPosition - platformPosition;
            move = true;
        }
    }
}

private void FixedUpdate()
{
    if (move)
        transform.Translate(movementDirection * speed * Time.deltaTime);

    move = false;
}

现在平台由Translate()FixedUpdate() 中移动。 OnTriggerStay() 只是检查是否应该移动平台。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    相关资源
    最近更新 更多