我正在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;
}
}
}
答案 0 :(得分:2)
Ball.gameObject.GetComponent<Rigidbody2D>().gravityScale = 0f;
这可能是造成问题的原因。
听起来,您在此行中引用的RigidBody2D与您之前使用GetComponent()检索的RigidBody2D不同。
GetComponent返回您从中调用它的GameObject的组件。因此,在我上面提到的代码中,
Ball.gameObject.GetComponent<RigidBody2D>()
和
GetComponent<RigidBody2D>()
会给你一个两个不同的RigidBody2D组件如果Ball字段没有引用你的BallLaunch脚本附加的同一个GameObject。
[
简单地改变:
Ball.gameObject.GetComponent<Rigidbody2D>().gravityScale = 0f;
要
GetComponent<Rigidbody2D>().gravityScale = 0f;
此外,由于您已将Start方法中的RigidBody2D引用到myRigidBody字段,因此可以将所有后续GetComponent替换为myRigidBody。
GetComponent<Rigidbody2D>().gravityScale = 0f;
要
myRigidBody.gravityScale = 0f;