Unity 2D引力中的错误?

时间:2018-01-02 01:55:24

标签: c# unity3d physics gravity

我正在Unity中用C#编写一个脚本,它本质上可以作为一个开关,为2D Rigidbody打开或关闭重力。当游戏开始时,Rigidbody的重力应为0。然后当用户点击空格键时,重力应该增加到3(这是)。然而,然而,当玩家与标记为“InvisGoal”的游戏对象发生碰撞时,玩家应该传送到另一个位置,然后重力应该再次为0。然而,玩家在与InvisGoal和传送接触后总是摔倒,我无法弄清楚原因。这是我在C#中的第一个项目,对于任何明显的错误都很抱歉..脚本在这里:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallLaunch : MonoBehaviour {

private Rigidbody2D myRigidBody;
public GameObject Ball;

// Use this for initialization
void Start ()
{
    myRigidBody = GetComponent<Rigidbody2D> ();
    GetComponent<Rigidbody2D>().gravityScale = 0f;
}

// Update is called once per frame
void Update ()
{
    if (Input.GetButtonDown ("Jump"))
    {
        GetComponent<Rigidbody2D> ().gravityScale = 3f;
    }
}
void OnTriggerEnter2D(Collider2D other){

    if (other.tag == "InvisGoal")
    {
        Ball.gameObject.GetComponent<Rigidbody2D>().gravityScale = 0f;
        transform.position = new Vector3 (0.61f, 1.18f, 0f);
        return;
    }
 }
}

1 个答案:

答案 0 :(得分:2)

Ball.gameObject.GetComponent<Rigidbody2D>().gravityScale = 0f;

这可能是造成问题的原因。

听起来,您在此行中引用的RigidBody2D与您之前使用GetComponent()检索的RigidBody2D不同。

GetComponent返回您从中调用它的GameObject的组件。因此,在我上面提到的代码中,

Ball.gameObject.GetComponent<RigidBody2D>()

GetComponent<RigidBody2D>()

会给你一个两个不同的RigidBody2D组件如果Ball字段没有引用你的BallLaunch脚本附加的同一个GameObject。

[Image 1]

假设BallLaunch脚本附加到Ball,你要设置重力(如上图所示)

简单地改变:

Ball.gameObject.GetComponent<Rigidbody2D>().gravityScale = 0f;

GetComponent<Rigidbody2D>().gravityScale = 0f;

此外,由于您已将Start方法中的RigidBody2D引用到myRigidBody字段,因此可以将所有后续GetComponent替换为myRigidBody。

GetComponent<Rigidbody2D>().gravityScale = 0f;

myRigidBody.gravityScale = 0f;