这是一个半复杂的问题,但我会尽力解释它:
我正在制作这款手机游戏,你必须拍摄四个立方体。我试图这样做,当子弹击中立方体时,无论何时射击立方体,它们都会被破坏并且UI文本显示为1/4到4/4。但它真的很奇怪,即使所有四个立方体都被射击和摧毁,也只能计入1/4。我把这两个脚本放在子弹上(我制作了两个单独的脚本来查看它是否可以做任何事情,它没有'
我已经使用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);
}
}
}
另一个编辑
我尝试了所有内容,那么有没有办法检测层次结构中父级中的所有子项何时被销毁?而不是计数?这可以提供更好的主意:
所以我希望能够检测Cube,Cube1,Cube2和Cube3何时被破坏。
答案 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);
}
}
}