【问题标题】:How to increase score in Unity 3D OnCollisionEnter如何在 Unity 3D OnCollisionEnter 中增加分数
【发布时间】:2014-07-17 20:07:14
【问题描述】:

我遇到了一个 c# 代码,该代码在第一次实例中应该很容易解决,但我无法让它工作。我正在 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);
            }

    }
}

两个脚本都附加到同一个游戏对象,但我收到此错误:

NullReferenceException: Object reference not set to an instance of an object
Collisions.OnCollisionEnter (UnityEngine.Collision obj_collision

另一方面,代码不加分,一直加1,实际得分保持在1。 我想这是因为每次游戏发生碰撞时,我都会创建一个新的 Puntuacion.cs 实例,包括值 puntuacionActual=0 和 maximaPuntuacion = 14;并在每次碰撞中将该 puntuacionActual 的值从 0 增加到 1。

我想要实现的是在系统墙壁上发生碰撞时增加得分值(+1),就是这样。我想为下一次碰撞保存该值。

我将非常感谢任何帮助我解决这个问题的人

最好的问候

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    是的,我认为您确实是对的,您的分数总是会被重置,因为您在 Collisions 脚本中创建了一个新的 Punctuation 实例。尝试改用GetComponent:

    Punctuation punctuationScript= gameObject.getComponent<Punctuation>();
    

    然后你可以像这样访问公共变量或方法:

    punctuationScript.incrementarPunctuation();
    

    这种方式不会创建新脚本,而是只会从该游戏对象中获取脚本。

    编辑:
    我刚刚将你的代码复制到我的项目中,当我使用你的代码时,我得到了和你一样的错误:

    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);
        }
    }
    

    你确定你是这样做的吗?

    【讨论】:

    • 感谢您回答杰。当我附加代码时出现此错误 OnCollisionEnter 我得到的代码:对象引用未设置为对象的实例 Collisions.OnCollisionEnter (UnityEngine.Collision obj_collision) 如果我将代码附加到 OnCollisionEnter 之外,我得到这个:字段初始化器无法引用非静态字段、方法或属性“UnityEngine.Component.gameObject”
    • 你希望他们碰撞时分数增加对吧?然后它应该放在方法OnCollisionEnter 中。你能看到错误指向哪条线吗?我很确定如果您将这些脚本附加到同一个游戏对象上,则不会发生该错误。也可以尝试在OnCollisionEnter 中的每个if 语句之前添加if(obj_collision != null),以防万一。
    • 当我调用 punctuationScript.incrementarPunctuation(); 时出现错误来自 Collision.cs 它说是引用一个空对象
    • 我试着复制你的作品,我已经更新了我的答案。请看一看。
    猜你喜欢
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    相关资源
    最近更新 更多