【问题标题】:How to stop player from automatically jumping on a moving platform?如何阻止玩家在移动平台上自动跳跃?
【发布时间】:2018-06-03 21:05:21
【问题描述】:

我制作了一个移动平台,它垂直地从上到下,然后从下到上,依此类推。平台移动正常,但将我的播放器放在上面会使我的播放器不稳定。

当平台从上到下移动时,我的播放器会在上面弹跳。当平台从底部移动到顶部时,它会在途中保持稳定,但当它到达顶部时,我的玩家会自行跳跃。

当我提高平台速度时,情况会变得更糟。我不知道它是由于统一的 2d 物理效应还是什么。我试图通过将反弹设置为 0 并将摩擦设置为 50,在我的玩家对象和平台上使用物理材质 2D,但似乎没有任何效果。有人知道如何禁用移动平台的物理效果吗?以下是我的移动平台代码:

public class BrickMoveVErtical : MonoBehaviour {
     public Vector3 positionOne;
     public Vector3 positiontwo;
     public Vector3 nextposition;
    /*Empty object is already made on unity editor and its parent of platform(Plank) and other  
       empty object "pointB". Point "B" is already mapped on editor and platform is set to go from 
         its original pos to point B */
     public Transform plankTranform;         
     public Transform positionBTransform;
     public float speed;
     // Use this for initialization
     void Start () {
         positionOne = plankTranform.localPosition;
         positiontwo = positionBTransform.localPosition;
         nextposition = positiontwo;
     }

     // Update is called once per frame
     void Update () {
         move();
             }
     private void move() {
    plankTranform.localPosition = Vector3.MoveTowards(plankTranform.localPosition,nextposition,Time.deltaTime*speed);
         if(Vector3.Distance(plankTranform.localPosition,nextposition)<0.1)
         { changeMovementPlank(); }
     }
     void changeMovementPlank() {
         nextposition = nextposition != positionOne ? positionOne : positiontwo;
     }                        

 }

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    在我的游戏中,我在使用快速平台时遇到了类似的问题,根据平台的方向,角色会悬空或滑落。 我找到了解决问题的方法,只需将角色 transform.parent 更改为它正在跳跃的平台,只要玩家存在平台碰撞器,只需返回玩家原始 transform.parent

    请注意,这可能会导致需要优化的其他错误或问题,具体取决于您的游戏。

    【讨论】:

    • 感谢这对我有用,但我遇到了一个小问题。通过使用transform.parent 使玩家成为平台的孩子,使我的玩家相对于平台缩小规模。有没有办法只使用父变换的位置属性而不必担心缩放?
    • 我没有安装统一的 atm,但如果我不得不猜测,可能会在命中后更改角色的局部比例来解决它。您可以使用平台的本地规模通过简单的乘法来做到这一点。
    • @EslaBaeny 您还可以使用比例为 1 的空游戏对象作为实际缩放平台所在的平台的容器。现在将父级更改为空容器不应影响播放器的规模
    • 如果在变换上使用 SetParent 函数会出现同样的问题吗?
    • 为了解决这个问题(至少这对我有用),将你的角色包装在另一个空的游戏对象中作为容器,这样,容器的比例会改变,但角色不会(除非你是改变游戏中平台的本地规模)。就像 Bijan 建议的那样,但要针对角色而不是每个平台这样做。
    【解决方案2】:

    您可以使用此代码设置/取消设置 GameObject 的父级:

    void OnTriggerEnter2D(Collider2D other)
    {
        if(other.gameObject.tag == "PlatformGroup")
            player.SetParent(other.gameObject.transform)
    
    }
    
    void OnTriggerExit2D(Collider2D other)
    {
        if(other.gameObject.tag == "PlatformGroup")
             player.SetParent(null);
    }
    

    你应该做的是:

    1. 创建一个空的游戏对象,然后将你的平台作为它的子对象 空游戏对象。将其标记为PlatformGroup

    2. 您添加脚本以将平台移动到此 EmptyGame 对象, 而不是在平台本身中使用它。

    3. 然后添加一个碰撞器到空游戏对象(PlatformGroup),另一个到播放器。将播放器之一设置为触发器。

    4. 将上面的代码添加到您的播放器控制器。

    现在,当玩家跳过平台时,如果将成为平台相同游戏对象的子对象,他们将一起移动,游戏对象不会发生任何变形。此外,当玩家离开平台、行走或跳出平台时,它将不再是孩子。

    【讨论】:

    • 我将不得不尝试这个,我最近遇到了 OP 正在谈论的同一个问题,我用一种我不喜欢的时髦方式修复了它。
    • 这对我不起作用,但我解决了在我的平台脚本中创建other.transform.SetParent(plankTranform); 的问题。现在我的播放器在平台上很稳定,这使得我的播放器转换属性的 plankTransform 父级也与我的播放器的规模有些混乱。我的播放器有时会在站在平台上缩小。
    • @EslaBaeny 我的方法在不改变播放器或平台的形状的情况下有效。但是在您的情况下,触发器在平台中,而不是在播放器中。这种方法还考虑到玩家最终会离开平台
    • @IgnacioAlorre 我厌倦了这段不起作用的代码。当玩家跳过平台时,它成为平台容器的子容器,而不是实际平台。这样,玩家位置不会改变 w.r.t 容器平台。容器静止,玩家随着平台本身下降,使玩家在平台上弹跳并让玩家不稳定。一种解决方法是在容器内设置玩家的实际移动平台父级,这可以解决问题,但由于在玩家上使用“other.transform.SetParent(plankTranform)”导致玩家规模缩小
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多