[英]How to increase score in Unity 3D OnCollisionEnter
我受困於一開始應該很容易解決的ac#代碼,但是我無法使其正常工作。 我正在Unity3D中制作視頻游戲,並且想創建一個函數,一旦物體與牆碰撞,該函數就可以增加得分。
我有2個腳本:
碼:
Puntuacion.cs
using UnityEngine;
using System.Collections;
public class Puntuacion : MonoBehaviour
{
public int puntuacionActual=0;
public int maximaPuntuacion = 14;
public Transform gamePointsTextActual; // Texto Marcador Actual
public Transform gamePointsTextMaxima; // Texto Marcador Maxima
void Start ()
{
gamePointsTextActual=GameObject.Find("Texto 3D - ScoreActual").transform;
gamePointsTextMaxima=GameObject.Find("Texto 3D - ScoreMaxima").transform;
}
void Update ()
{
gamePointsTextActual.GetComponent<TextMesh>().text=this.puntuacionActual.ToString("D3");
gamePointsTextMaxima.GetComponent<TextMesh>().text=this.maximaPuntuacion.ToString("D3");
if(puntuacionActual>maximaPuntuacion)
{
maximaPuntuacion = puntuacionActual;
gamePointsTextActual.GetComponent<TextMesh>().text=this.maximaPuntuacion.ToString("D3");
}
}
public void incrementarPuntuacion()
{
puntuacionActual = puntuacionActual+1;
Debug.Log("Puntuacion Actual :"+puntuacionActual);
if(puntuacionActual>maximaPuntuacion)
{
maximaPuntuacion = puntuacionActual;
}
}
}
Collisions.cs
using UnityEngine;
using System.Collections;
public class Collisions : MonoBehaviour
{
public Puntuacion puntuacion = new Puntuacion();
public void OnCollisionEnter(Collision obj_collision )
{
if(obj_collision.gameObject.name == "HitScore")
{
Debug.Log("Collision");
puntuacion.incrementarPuntuacion();
Destroy(gameObject,2.0F);
}
if(obj_collision.gameObject.name == "Plane")
{
Debug.Log("Collision Plano");
Destroy(gameObject,1.0F);
}
}
}
兩個腳本都附加到相同的GameObject,但出現此錯誤:
NullReferenceException: Object reference not set to an instance of an object
Collisions.OnCollisionEnter (UnityEngine.Collision obj_collision
另一方面,代碼不會增加分數,總會增加1且實際分數保持為1。我想這是因為每次游戲上發生碰撞時,我都會創建一個包含值的新Puntuacion.cs實例。 puntuacionActual = 0,maximumPuntuacion = 14; 並在每次碰撞中將puntuacionActual的值從0增加到1。
我想要實現的是在系統牆壁發生碰撞時增加得分值(+1),我想為下次碰撞保存該值。
我將非常感謝任何幫助我解決這個問題的人
最好的祝福
是的,我認為您確實是對的,您的分數總是會重置,因為您在Collisions
腳本中創建了新Punctuation
的實例。 嘗試改用GetComponent
:
Punctuation punctuationScript= gameObject.getComponent<Punctuation>();
然后,您可以像下面這樣訪問公共變量或方法:
punctuationScript.incrementarPunctuation();
這樣,將不會創建新腳本,而只會從該gameObject獲取腳本。
編輯:
我只是將您的代碼復制到我的項目中,所以在使用代碼時會收到與您相同的錯誤:
Collisions.cs
public Puntuacion puntuacion = new Puntuacion();
public void OnCollisionEnter(Collision obj_collision)
{
if(obj_collision.gameObject.name == "HitScore")
{
Debug.Log("Collision");
puntuacion.incrementarPuntuacion();
Destroy(gameObject,2.0F);
}
}
但是,當我嘗試使用提供給您的代碼后,一切都很好,並且分數甚至正確地提高了:
public void OnCollisionEnter(Collision obj_collision)
{
if(obj_collision.gameObject.name == "HitScore")
{
Debug.Log("Collision");
Puntuacion puntuacionScript = gameObject.GetComponent<Puntuacion>();
puntuacionScript.incrementarPuntuacion();
Destroy(gameObject,2.0F);
}
}
您確定已經做到了嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.