分数不适用于预制件

时间:2016-06-27 22:32:00

标签: c# unity3d unity5

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

我正在制作这款手机游戏,你必须拍摄四个立方体。我试图这样做,当子弹击中立方体时,无论何时射击立方体,它们都会被破坏并且UI文本显示为1/4到4/4。但它真的很奇怪,即使所有四个立方体都被射击和摧毁,也只能计入1/4。我把这两个脚本放在子弹上(我制作了两个单独的脚本来查看它是否可以做任何事情,它没有'

为了更好地了解我所谈论的内容,这里是游戏本身的截图。image

我已经使用Unity大约6天了,所以我为我说的那些noob-ish道歉。

修改

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

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

另一个编辑

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

cubes

所以我希望能够检测Cube,Cube1,Cube2和Cube3何时被破坏。

1 个答案:

答案 0 :(得分:2)

答案非常简单:由于每个子弹都有该脚本,因此每个子弹都有自己的分数。

对于像分数这样的东西,你想要一个点来存储它,例如作为游戏控制器的空游戏对象上的脚本。只需在碰撞中访问并增加分数(可能在这里查看单身人士)。

你可以将这两个脚本结合起来,实际上最好不要在子弹上有这个,但是在目标上可能更好,因为它们可能更少,这将为你节省一些性能。 (从逻辑的角度来看,它更有意义。)

修改
我假设您使用带有预制件的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);
        }
    }
}