- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我的游戏世界中有三个不同的“旁观者”,每个都有一个附加的“旁观者”脚本,并且我的 UI 中有一个“旁观者对话”元素。这个想法是,当玩家进入任何旁观者的范围时,会显示从数据库中随机选择的文本,但对于我的脚本,它只对其中一个旁观者有效。
我觉得我交叉引用脚本太多了,但我不知道。下面是两部分代码:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class Bystander : MonoBehaviour {
GameObject player;
public bool speak;
public bool isPlayerNear;
public int dialogueNumber;
GameObject bystanderDialogueObject;
BystanderDialogue bystanderDialogue;
// Use this for initialization
void Awake ()
{
player = GameObject.FindGameObjectWithTag ("Player");
bystanderDialogueObject = GameObject.Find ("BystanderDialogue");
bystanderDialogue = bystanderDialogueObject.GetComponent<BystanderDialogue> ();
}
// Update is called once per frame
void Update ()
{
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject == player)
{
dialogueNumber = Random.Range (0, bystanderDialogue.bystanderSpeech.Length);
speak = true;
isPlayerNear = true;
}
}
void OnTriggerExit(Collider other)
{
if (other.gameObject == player)
{
speak = false;
isPlayerNear = false;
}
}
}
第二个附加到 UI 对象“BystanderDialogue”:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class BystanderDialogue : MonoBehaviour {
Text text;
GameObject[] bystanderObjects;
Bystander bystander;
public string[] bystanderSpeech;
// Use this for initialization
void Awake ()
{
text = GetComponent<Text> ();
bystanderObjects = GameObject.FindGameObjectsWithTag ("NPC");
foreach (GameObject bystanderObject in bystanderObjects)
{
bystander = bystanderObject.GetComponent<Bystander> ();
}
}
// Update is called once per frame
void Update ()
{
BystanderSpeak (bystander);
if (bystander.isPlayerNear)
{
Debug.Log ("New bystander!");
}
}
void BystanderSpeak(Bystander bystander)
{
if (bystander.speak && bystander.isPlayerNear)
{
text.text = bystanderSpeech[bystander.dialogueNumber];
}
else if (!bystander.speak && !bystander.isPlayerNear)
{
text.text = "";
}
}
}
我很确定我犯了一些基本错误,所以很抱歉。非常感谢任何帮助!
最佳答案
这段代码没有意义:
void Awake ()
{
text = GetComponent<Text> ();
bystanderObjects = GameObject.FindGameObjectsWithTag ("NPC");
foreach (GameObject bystanderObject in bystanderObjects)
{
bystander = bystanderObject.GetComponent<Bystander> ();
}
}
如果有多个 bystanderObject,那么您只保留最后一个对象作为 bystander
成员字段的引用。您应该使用集合(列表或数组)来保留所有这些:
Bystander[] bystanders;
void Awake()
{
bystanderObjects = GameObject.FindGameObjectsWithTag ("NPC");
bystanders = new Bystander[bystanderObjects.Length];
for (var i = 0; i < bystanderObjects.Length; ++i)
{
bystander[i] = bystanderObjects[i].GetComponent<Bystander>();
}
}
编辑:您似乎误解了 Unity 中两帧之间的一切运作方式。我建议你阅读 Execution Order of Event Functions .
您的 Update()
方法将在屏幕上绘制任何内容之前完成。因此,如果您覆盖 Text
的值,则只会显示最后写入的值。事实上,每个 bystander
都需要一个 Text
实例。
关于c# - gameObject 的多个实例表现不尽相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30630338/
我对在编写 Unity 脚本时继承自 MonoBehaviour 的 gameObject 的使用有疑问。 在一些教程中,例如制作缩放的健康条,我们检索健康条的原始比例如下: originalScal
我有一个名为 trigger 的无敌 GameObject,当我的 Hero 与它碰撞时,一盏枝形吊灯会掉落。我想给枝形吊灯一个 Rigidbody,这样它就会掉落,您可以与它碰撞并使用它。 如果你能
我正在使用 Unity 开发一款游戏,其中所有带有特定标签的 Gameobjects 都会相当规律地消失/重新出现(平均每 10 秒一次)。我使用 GameObject.FindGameObjects
public void FindClosestEnemy() { List pList = GameObject.FindGameObjectsWithTag("Player");
我有两个像这样的 GameObject: public class GOA : MonoBehaviour { void Start() { ... do something
概览 考虑一个简单的硬币收集游戏。有两个脚本,CollectableItem 和 ItemVault。 CollectableItem 有一个 value 属性,它告诉项目的值(value),它被添加
我试图找出我的游戏对象正在被我的游戏中的哪个脚本破坏。 到目前为止,我尝试打印堆栈,但那里没有提到销毁游戏对象的脚本的详细信息 代码:Debug.Log(UnityEngine.StackTraceU
在 Unity3D 序列化 GameObject 之前是否有任何回调(或任何其他方式)通知? 我需要类似于 OnSerializeNetworkView 的东西但对于常规 GameObject。 有用
我正在使用 Unity 制作游戏。我在随机位置实例化 (circle) GameObjects 并且效果很好。我想要做的是仅在不会与其他 GameObjects 重叠的位置实例化。我在互联网上找到的解
我遇到了一个小问题。 我制作了一个 3D 立方体并设置了 GoogleVR SDK,以便在 VR 屏幕的中点进入立方体时使用事件触发器。发生这种情况时,将触发我的自定义方法 LookAtCube()。
我想获取某个文件夹中的所有预制件,然后将其转换为列表 我的代码: this.list = (List) (Resources.LoadAll("items")).ToList(); // this c
所以我的游戏世界中有三个不同的“旁观者”,每个都有一个附加的“旁观者”脚本,并且我的 UI 中有一个“旁观者对话”元素。这个想法是,当玩家进入任何旁观者的范围时,会显示从数据库中随机选择的文本,但对于
我正在编写我的游戏 Boss 行为代码,在战斗的最后阶段,Boss 应该向玩家冲锋,然后回到原来的位置。等待 5 秒,然后执行相同的操作。 我尝试使用协同程序和 Vector2.MoveTowards
总结如下:我想从 OnTriggerEnter2D 事件中找到参与碰撞的两个对撞机。我该怎么做? 我有两个游戏对象。两者都有一个碰撞器和一个触发器。 在对象 A 上,它被触发器包围。在对象 B 上,触
我目前有一个脚本应该实例化一个粒子系统并在一定时间后销毁它,但是在实例化对象之后,出现此错误代码: MissingReferenceException: The object of type 'Par
我目前有一个脚本应该实例化一个粒子系统并在一定时间后销毁它,但是在实例化对象之后,出现此错误代码: MissingReferenceException: The object of type 'Par
Unity 对象不在中心旋转。直到一个小时都很好,我不相信我更改了代码或任何东西。我也试过弄乱左上角的枢轴/中心按钮,但没有任何帮助。游戏对象没有在中间旋转。 旋转器代码: using UnityEn
我很难将一些游戏对象链接在一起以“跟随领导者”。 这就是我想要完成的: 有“头”对象的地方,它会拉动 body 对象。像蛇或蜈蚣。 然而,这是正在发生的事情: 它们都有点跟随头部,但它们似乎作为一个整
假设我的脚本定义如下。 public GameObject _GameObject; private void Start() { [![enter image description here][1
所以基本上我是在尝试将一群 child 添加到游戏对象中。父游戏对象称为 SnakeHead,而所有其他游戏对象称为 SnakeBodyParts public class GameControlle
我是一名优秀的程序员,十分优秀!