簡體   English   中英

如何在Unity 3D OnCollisionEnter中提高得分

[英]How to increase score in Unity 3D OnCollisionEnter

我受困於一開始應該很容易解決的ac#代碼,但是我無法使其正常工作。 我正在Unity3D中制作視頻游戲,並且想創建一個函數,一旦物體與牆碰撞,該函數就可以增加得分。

我有2個腳本:

  1. Puntuacion.cs //用於增加和設置MAX和ACTUAL得分值的所有功能
  2. Collisions.cs //用於檢測游戲中何時發生碰撞的腳本

碼:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM