【问题标题】:Score Count not working on a prefab分数计数不适用于预制件
【发布时间】:2016-06-29 05:22:39
【问题描述】:

这是一个半复杂的问题,但我会尽力解释它:

我正在制作这款手机游戏,您必须在其中射击四个立方体。我正在努力做到这一点,所以当立方体被子弹击中时,它们会被摧毁,并且每当一个立方体被射击时,UI 文本都会显示 1/4 到 4/4。但这真的很奇怪,即使所有四个立方体都被射击并摧毁,也只能算到 1/4。我将这两个脚本放在子弹上(我制作了两个单独的脚本,看看是否可以做任何事情,但没有)

为了更好地理解我在说什么,这里是游戏本身的截图。

我已经使用 Unity 大约 6 天了,所以对于我所说的任何菜鸟问题,我深表歉意。

编辑

所以我将这两个脚本组合到一个空的游戏对象上,这是新的脚本:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class GameManagerScript : MonoBehaviour {
public GameObject cubes;
public Text countText;
public int cubeCount;
public Transform target;

// Use this for initialization
void Start () {

}

void OnTriggerEnter(Collider other)
{
    cubes = other.gameObject;
}

// Update is called once per frame
void Update () {

    cubes.transform.position = Vector3.MoveTowards(transform.position, target.position, 1f * Time.deltaTime);


    if (cubes.gameObject.tag == "BULLET")
    {

        cubeCount = cubeCount + 1;
        countText.text = cubeCount + "/4";
        cubes.SetActive(false);
    }
}
}

另一个编辑

我尝试了所有方法,那么有没有办法检测层次结构中父级中的所有子级何时被销毁?而不是数数?这可以提供一个更好的主意:

所以我希望能够检测到 Cube、Cube1、Cube2 和 Cube3 何时都已被销毁。

【问题讨论】:

    标签: c# unity3d unity5


    【解决方案1】:

    答案很简单:由于每个项目符号都有相应的脚本,因此每个项目符号都有自己的分数。

    对于诸如乐谱之类的东西,您需要一个单独的位置来存储它,例如用作游戏控制器的空游戏对象上的脚本。只需在碰撞中访问它并增加分数(也许看看这里的单例)。

    您可以将这两个脚本结合起来,实际上最好不要将它放在项目符号上,而是放在目标上,因为它们的数量可能更少,这会节省一些性能。 (从逻辑的角度来看,它更有意义。)

    编辑:
    我假设您使用带有预制件的Instantiate 创建子弹。预制件(= 蓝图)实际上不在游戏中(只有场景/层次结构中的对象在游戏中)。每次使用 Instantiate 都将使用它自己的组件版本创建该预制件的新实例。单例是只能存在一次的东西,但这也是我在这里提到它的原因,你可以在没有 Find 之类的东西的情况下访问它。它是某种静态的。一个空的游戏对象只是一个没有视觉效果的对象。您可以轻松地统一创建一个(右键单击>创建空)。它们通常用作容器和脚本持有者。

    编辑:
    你想要的是:

    • 一个空的游戏对象,带有一个保存分数的脚本。
    • 使用OnTriggerEnter 检测碰撞的脚本,该脚本将位于子弹或目标上。

    现在,这只是一个非常简单的示例,可以进行优化,但我希望这会给您一个想法。
    得分脚本,放置在一个空的游戏对象上:

    public class ScoreManager : MonoBehaviour
    {
        public Text scoreText;    // the text object that displays the score, populate e.g. via inspector
    
        private int score;
    
        public void IncrementScore()
        {
            score++;
            scoreText.text = score.ToString();
        }
    }
    

    子弹版本的碰撞脚本:

    public class Bullet : MonoBehaviour
    {
        private ScoreManager scoreManager;
    
        private void Start()
        {
            scoreManager = GameObject.FindWithTag("GameManager").GetComponent<ScoreManager>();    // give the score manager empty gameobject that tag
        }
    
        private void OnTriggerEnter(Collider other)
        {
            if(other.CompareTag("Target") == true)
            {
                 // update score
                 scoreManager.IncrementScore();
                 // handle target, in this example it's just destroyed
                 Destroy(other.gameObject);
            }
        }
    }
    

    【讨论】:

    • 我相信只有一颗子弹,我遵循了子弹教程,它们来自枪上的子弹发射器游戏对象,只是一遍又一遍地重生。虽然我可能是错的,但我尝试将这两个脚本组合为四个目标中的一个,但同样的事情仍然发生。你能解释一下如何使用一个空的游戏对象吗?我不确定单例是什么。谢谢
    • @JuanFranciscoPatino 我在回答中添加了一些内容。
    • 谢谢你,我也编辑了我的答案,问你另一个问题。
    • 啊,你误会了我:) OnCollisionEnter 的东西要么留在子弹上,要么留在立方体上。只是比分移动到空。也许看看这个教程。为新的 GUI 提供了一些注释。 unity3d.com/learn/tutorials/projects/space-shooter-tutorial/…
    • 谢谢,我去看看
    猜你喜欢
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    相关资源
    最近更新 更多