【问题标题】:How to turn off gravity for my player after a collision?碰撞后如何为我的玩家关闭重力?
【发布时间】:2020-12-05 18:14:53
【问题描述】:

当我的玩家撞到一个物体时如何关闭我的重力来创造一个很酷的飞行碰撞效果

这是我目前的代码:

using UnityEngine;

public class PlayerCollision : MonoBehaviour{

    public PlayerMovement movement;
    void OnCollisionEnter (Collision CollisionInfo) {
        
        Debug.Log(CollisionInfo.collider.name);

        if (CollisionInfo.collider.tag == "Obstacle"){
            movement.enabled = false;
            // Rigidbody.useGravity = false;
        }
    }
}

我试过Rigidbody.useGravity = false;,但还是不行。

P.S.:禁用移动意味着我无法控制移动,除非我的玩家完全停止移动。

【问题讨论】:

  • 如果我没记错的话,您不是必须通过GetComponent<Rigidbody> 或类似的方式获得Rigidbody 吗?自从我上次使用 Unity 以来,他们可能已经改变了它。

标签: c# unity3d collision gravity


【解决方案1】:

最适合您的解决方案是使用 GetComponent,它会获取播放器的刚体组件,您可以对其进行修改:

public class PlayerCollision : MonoBehaviour{

    public PlayerMovement movement;
    void OnCollisionEnter (Collision CollisionInfo) {
        
        Debug.Log(CollisionInfo.collider.name);

        if (CollisionInfo.collider.tag == "Obstacle"){
            movement.enabled = false;
            GetComponent<Rigidbody>().useGravity = false;            
        }       
    }
}

【讨论】:

    【解决方案2】:

    尝试链接刚体。在您共享的代码中,它引用了“刚体”类,而不是播放器上的刚体组件。

    这可以通过使用 Get Component() 来完成。如果您的脚本位于具有刚体的玩家对象上,则此脚本将起作用:

    public class PlayerCollision : MonoBehaviour
    {
    
        public PlayerMovement movement;
    
        private Rigidbody rigidbody;
    
        void Start()
        {
            rigidbody = gameObject.GetComponent<Rigidbody>();
        }
        void OnCollisionEnter(Collision CollisionInfo)
        {
    
            Debug.Log(CollisionInfo.collider.name);
    
            if (CollisionInfo.collider.tag == "Obstacle")
            {
                movement.enabled = false;
                rigidbody.useGravity = false;
    
            }
    
    
        }
    }
    

    或者你可以像这样公开刚体组件并通过统一编辑器分配它:

    public class PlayerCollision : MonoBehaviour
    {
    
        public PlayerMovement movement;
    
        public Rigidbody rigidbody;
    
        void OnCollisionEnter(Collision CollisionInfo)
        {
    
            Debug.Log(CollisionInfo.collider.name);
    
            if (CollisionInfo.collider.tag == "Obstacle")
            {
                movement.enabled = false;
                rigidbody.useGravity = false;
    
            }
    
    
        }
    }
    

    【讨论】:

      【解决方案3】:
      if (CollisionInfo.collider.tag == "Obstacle"){
                  movement.enabled = false;
                  col = GetComponent<Collider>();
                  // Rigidbody.useGravity = false;
                 if (col.attachedRigidbody)
                   col.attachedRigidbody.useGravity = false;
              }
      

      重力获取准确的对象必须附加重力,并且您必须在获取 col 或对象已附加它时使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多