我是新手,試圖製作一個簡單的點擊跳轉式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