unity3d 我在Unity中的分数计数随机下降

fjaof16o  于 2023-04-21  发布在  其他
关注(0)|答案(2)|浏览(186)

我有一个游戏,每当你杀死一个僵尸,你得到一个点。它的工作原理,但由于某种原因,有时当我杀死一个僵尸的分数会下降一个随机的数量,即使我从来没有编码,使分数可以下降。这里是碰撞脚本,这是得分计算的地方。我愿意回答你们的任何问题。谢谢!点击这里的Game Footage

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CollisionScript : MonoBehaviour
{
    private int killCount;
    public Text scoreCount;

    private void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.CompareTag("zombie"))
        {
            Destroy(other.gameObject);
            killCount += 1;
            scoreCount.text = "Kill Count: " + killCount.ToString();
        }
    }
}

我试着看看分数下降是否有任何特定的模式,但它似乎是完全随机的。

bzzcjhmw

bzzcjhmw1#

其他人已经指出了这个问题。你在每把剑上运行了两个CollisionScript的示例。根据物理刻度期间哪把剑与僵尸碰撞,会显示不同的内部击杀计数。这就是为什么分数有时会跳回几个值,然后突然跳回一个高值。
您可以将killCount转换为静态,或者创建一个KillManager来跟踪killCount

public class KillManager : MonoBehaviour
{
  private int killCount;
  public Text scoreCount;

  public void AddPoint()
  {
    killCount++;
    scoreCount.text = "Kill Count: " + killCount.ToString();
  }
}

public class CollisionScript : MonoBehaviour
{
  public KillManager manager;

  private void OnCollisionEnter2D(Collision2D other)
  {
    if (other.gameObject.CompareTag("zombie"))
    {
      Destroy(other.gameObject);
      manager.AddPoint();
    }
  }
}

这样你就不会看到分数下降,但你会注意到另一个错误。如果在同一个物理勾选两把剑接触同一个僵尸,你会得到两分。要解决这个问题,你有很多选择。

1.使用单盒碰撞器

在你的例子中,剑是以盒子的形式被拿着的。没有理由为每把剑安装两个独立的碰撞器。一个盒子就可以了,玩家也不会知道。一个盒子意味着一次碰撞和一个击杀计数器。显示器不与其他资源共享。

2.给你的Zombie添加一个被杀死的bool

你可以在你的僵尸正在运行的脚本中添加一个公共bool。当剑遇到亡灵的肉时,你可以快速检查bool,看看僵尸是否已经被其他东西杀死。如果不是,你可以增加分数并将僵尸标记为已杀死。

public class Zombie : MonoBehaviour
{
  public bool killed = false;
}

public class CollisionScript : MonoBehaviour
{
  public KillManager manager;

  private void OnCollisionEnter2D(Collision2D other)
  {
    if (other.gameObject.CompareTag("zombie"))
    {
      Zombie zombie = other.gameObject.GetComponent<Zombie>();
      if(!zombie.killed)
      {
        Destroy(other.gameObject);
        manager.AddPoint();
        zombie.killed = true;
      }
    }
  }
}
rkkpypqq

rkkpypqq2#

现在的代码不会减少计数器。正如@jdweng所评论的,你可能会看到这个调用的不同示例的输出。
我建议在调试时做一些临时性的修改,给予每个CollisionScript示例一个唯一的编号。

public class CollisionScript : MonoBehaviour
{
    private static _globalCounter;       // <===
    private _number;                     // <===

    private int killCount;
    public Text scoreCount;

    public CollisionScript()             // <===
    {
        _number= ++_globalCounter;      // <===
    }

    private void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.CompareTag("zombie"))
        {
            Destroy(other.gameObject);
            killCount += 1;
            scoreCount.text = $"#{_number}: Kill Count: {killCount}";   // <===
        }
    }
}

注意,Unity调用构造的次数比您预期的要多,所以不必担心丢失数字。

相关问题