我是新手,试图制作一个简单的点击跳转式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,有趣的是我的分数正在像每秒帧数一样增加。
唷!这就是我希望你们能够理解我的问题并为我提供解决方案。问题很少,但我认为我应该解释它并尽可能清楚地说明问题。
yes我也是这么做的,但是它没有用,因为我对我应该分配给gameObjects(crate和clone)的方式感到困惑,所以我把我的箱子预制分配给它们两个。如果这是问题,我不会。 – 2015-02-23 12:14:32
障碍不要伤害箱子 - 你后来实例化的预制,但破坏克隆。在Score类中,您引用了主对象而不是实例。在Generate类中添加GameObject.Find(“Player”)。GetComponenet().obstacle = clone。在获得该位置之前,在得分类中验证您的对象是否为空。防爆。如果(obs!= null && obs.transfrom!= null)//比您的代码更为谨慎 –
2015-02-23 12:24:35
请注意,这是一个临时解决方案,用于验证它是否有效。如果它只在Start中使用GameObject.Find(“Player”),GetComponenet(),并保存对它的引用。 GameObject.Find()有点慢,可能会影响性能 –
2015-02-23 12:28:11