【发布时间】:2019-09-03 11:10:34
【问题描述】:
在我的游戏中,我有一个名为 ExclamationMark 的游戏对象,我想在玩家进入范围并且他们变得“警觉”时在敌人头顶上方生成它。
我制作了这个简单的脚本来执行此操作,但由于某种原因,它只能在一个游戏对象上运行。
我的敌人脚本:
void CheckForPlayer()
{
// Define player and get position
var player = GameObject.FindWithTag("Player");
var playerPos = (int)player.transform.position.x;
if (transform.Find("Graphics"))
{
// Define gameobject position
var enemyPos = transform.Find("Graphics").gameObject.transform.position.x;
// Define range to spawn tiles in
var range = 5;
var rangeInfront = enemyPos + range;
var rangeBehind = enemyPos - range;
if (playerPos >= rangeBehind && playerPos <= rangeInfront)
{
enemyIsActive = true;
if (transform.Find("ExclamationMark"))
{
var exMark = transform.Find("ExclamationMark").gameObject.GetComponent<ExclamationMarkSpawn>();
exMark.SpawnExclamationMark();
}
}
else
{
enemyIsActive = false;
}
}
}
我的! 脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ExclamationMarkSpawn : MonoBehaviour {
public GameObject spawnPos;
public GameObject exclamationMark;
public GameObject exclamationMarkAudio;
public void SpawnExclamationMark()
{
StartCoroutine(GameObject.FindGameObjectWithTag("MainCamera").GetComponent<CameraShake>().Shake(0.2f, 0.2f, 0.2f));
Instantiate(exclamationMark, spawnPos.transform.position, Quaternion.identity);
if (exclamationMarkAudio)
Instantiate(exclamationMarkAudio, spawnPos.transform.position, Quaternion.identity);
StartCoroutine(DestroyExclamationMark());
}
IEnumerator DestroyExclamationMark()
{
yield return new WaitForSeconds(1);
var children = new List<GameObject>();
foreach (Transform child in transform) children.Add(child.gameObject);
children.ForEach(child => Destroy(child));
}
}
【问题讨论】:
-
您要查找的 transform.Find("Graphics") 是什么?如果你有所有的敌人对象调用图形,统一只会采取第一个
-
不是解决方案,而是:代替
transform.Find("Graphics").gameObject.transform.position.x;,您可以简单地写transform.Find("Graphics").position.x;,因为transform.Find已经返回Transform。同样的方法你可以在Find("ExclamationMark")之后省略gameObject -
整个区块
var range = 5; var rangeInfront = enemyPos + range; var rangeBehind = enemyPos - range; if (playerPos >= rangeBehind && playerPos <= rangeInfront)可以简化为if(Mathf.Abs(playerPos - enemyPos) <= 5);) -
一般来说,你应该强烈避免所有这些
Find调用.. 它们效率很低!而是存储参考文献之一,例如在Awake中,然后进一步重复使用它们 -
CheckForPlayer在哪里调用?在Update?