2015-02-23 60 views
1

我是新手,试图制作一个简单的点击跳转式2D游戏,我能够自己弄清楚事情,但我无法做任何事情问题。 所以问题是: - 1)。我有三个脚本Movement.cs,Obstacle.cs和Score.cs(Movement.cs和Score.cs都附加到“Player”gameObject)。 2)。在Score.cs中,我希望每次玩家跳跃时都得分++,避免与障碍物发生碰撞(就像飞扬的小鸟)。如何获得每个实例化的游戏对象的位置Unity 2D

3)这是我的Score.cs脚本: 包括我,因为 “没有格式化代码” 错误

using UnityEngine; 
 
using System.Collections; 
 

 
public class Score : MonoBehaviour 
 
{ 
 
\t public GameObject obstacle; 
 
\t public Obstacle obs; 
 
\t public int score; 
 

 
\t void Start() 
 
\t { 
 
\t \t obstacle = GameObject.Find("Crate"); 
 
\t \t obs = obstacle.GetComponent<Obstacle>(); 
 
\t } 
 

 
\t void Update() 
 
\t { 
 
\t \t if (obs.transform.position.x <= transform.position.x); 
 
\t \t { 
 
\t \t \t score++; 
 
\t \t \t Debug.Log (score); 
 
\t \t } 
 
\t \t Debug.Log (score); 
 
\t } 
 
}

上面提到的脚本代码段产生以下错误

MissingReferenceException:本“障碍”类型的对象已被销毁,但您仍然试图访问它。你的脚本应该检查它是否为空或者你不应该销毁该对象。我发现的是,“obs.transform.position.x”给出了原始预制的位置,而不是它产生的复制的位置(我观察它,当我使用Debug.Log(obs.transform .position.x))。 4)。我的Obstacle.cs脚本是:

再次出于同样的原因,我包含片段。

using UnityEngine; 
 
using System.Collections; 
 

 
public class Obstacle : MonoBehaviour { 
 

 
\t public GameObject crate; 
 
\t //public GameObject clone; 
 
\t public float t = 1f; 
 
\t public int score = 0; 
 
\t public float startingPositionX = 2.53f; 
 
\t public float startingPositionY = -3.50f; 
 

 
\t void Start() 
 
\t { 
 
\t \t Invoke ("Generate", t); 
 
\t } \t 
 

 
\t void Update() 
 
\t { 
 
\t \t var x = -6f; 
 
\t \t var y = 0f; 
 
\t \t rigidbody2D.velocity = new Vector2 (x, y); 
 
\t \t //Debug.Log(clone.transform.position.x); 
 

 
\t \t /*if(clone.transform.position.x == -9.53f) 
 
\t \t { 
 
\t \t \t score++; 
 
\t \t \t Debug.Log(score); 
 
\t \t }*/ 
 

 
\t \t Destroy (crate, 3.0f); 
 
\t } 
 

 
\t void Generate() 
 
\t { 
 
\t \t /*clone = */Instantiate (crate, new Vector3 (startingPositionX, startingPositionY, 0f), Quaternion.identity); 
 
\t } 
 
}

我试图赋予“克隆”我的箱子预制件的复印件,在我Obstacle.cs脚本做的事情比分,但它也没有工作。 5)。由于上述错误和问题,现在我无法将分数提高1,有趣的是我的分数正在像每秒帧数一样增加。

唷!这就是我希望你们能够理解我的问题并为我提供解决方案。问题很少,但我认为我应该解释它并尽可能清楚地说明问题。

回答

0

为什么这不工作?我尝试将我的箱子预制件的副本分配给“克隆”,并在我的Obstacle.cs脚本中做分数的事情,但它也没有奏效。你把它投到了游戏对象?像

clone = Instantiate (crate, new Vector3 (startingPositionX, startingPositionY, 0f), Quaternion.identity) as GameObject; 

? 你现在拥有的是给你一个nullreference,因为你试图访问被销毁对象的transfrom属性。

+0

yes我也是这么做的,但是它没有用,因为我对我应该分配给gameObjects(crate和clone)的方式感到困惑,所以我把我的箱子预制分配给它们两个。如果这是问题,我不会。 – 2015-02-23 12:14:32

+0

障碍不要伤害箱子 - 你后来实例化的预制,但破坏克隆。在Score类中,您引用了主对象而不是实例。在Generate类中添加GameObject.Find(“Player”)。GetComponenet ().obstacle = clone。在获得该位置之前,在得分类中验证您的对象是否为空。防爆。如果(obs!= null && obs.transfrom!= null)//比您的代码更为谨慎 – 2015-02-23 12:24:35

+0

请注意,这是一个临时解决方案,用于验证它是否有效。如果它只在Start中使用GameObject.Find(“Player”),GetComponenet (),并保存对它的引用。 GameObject.Find()有点慢,可能会影响性能 – 2015-02-23 12:28:11

相关问题