C# gameObject的多个实例的执行方式不同
因此,在我的游戏世界中,我有三个不同的“旁观者”,每个人都有一个附加的“旁观者”脚本,并且在我的UI中有一个“旁观者对话”元素。其想法是,当玩家进入任何旁观者的范围时,会显示从数据库中随机选择的文本,但对于我的脚本,它只对其中一个旁观者有效 我觉得我交叉引用的脚本太多了,但我不知道。以下是代码的两部分:C# gameObject的多个实例的执行方式不同,c#,unity3d,gameobject,C#,Unity3d,Gameobject,因此,在我的游戏世界中,我有三个不同的“旁观者”,每个人都有一个附加的“旁观者”脚本,并且在我的UI中有一个“旁观者对话”元素。其想法是,当玩家进入任何旁观者的范围时,会显示从数据库中随机选择的文本,但对于我的脚本,它只对其中一个旁观者有效 我觉得我交叉引用的脚本太多了,但我不知道。以下是代码的两部分: using UnityEngine; using UnityEngine.UI; using System.Collections; public class Bystander : Mono
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;
}
}
}
使用UnityEngine;
使用UnityEngine.UI;
使用系统集合;
公共阶层旁观者:单一行为{
游戏对象玩家;
公共演讲;
公共图书馆;
公共int对话编号;
游戏对象旁观者DialogueObject;
旁观者对话旁观者对话;
//用于初始化
无效唤醒()
{
player=GameObject.FindGameObjectWithTag(“player”);
BystanderDialogue=GameObject.Find(“BystanderDialogue”);
bystanderDialogue=bystanderDialogueObject.GetComponent();
}
//每帧调用一次更新
无效更新()
{
}
无效对撞机(对撞机其他)
{
if(other.gameObject==玩家)
{
dialogueNumber=Random.Range(0,旁观者对话.bystanderDialogue.bystanderSpeech.Length);
说=真;
isPlayerNear=真;
}
}
void OnTriggerExit(碰撞器其他)
{
if(other.gameObject==玩家)
{
说=假;
isPlayerNear=假;
}
}
}
第二个附加到UI对象“旁观者对话”上:
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 = "";
}
}
}
使用UnityEngine;
使用UnityEngine.UI;
使用系统集合;
公共类旁观者对话:单一行为{
文本;
游戏对象[]旁观者对象;
旁观者;
公共字符串[]旁观者讲话;
//用于初始化
无效唤醒()
{
text=GetComponent();
旁观者对象=GameObject.FindGameObjectsSwithTag(“NPC”);
foreach(旁观者对象中的游戏对象旁观者对象)
{
bystander=bystanderObject.GetComponent();
}
}
//每帧调用一次更新
无效更新()
{
旁观者峰(旁观者);
if(旁观者。显示者)
{
Log(“新的旁观者!”);
}
}
无效旁观者峰(旁观者)
{
if(bystander.speak&&bystander.isplayer)
{
text.text=旁观者讲话[bystander.dialogueNumber];
}
如果(!bystander.speak&!bystander.isPlayerNear),则为else
{
text.text=”“;
}
}
}
我很确定我犯了一些基本的错误,所以道歉。非常感谢您的帮助 此代码没有意义:
void Awake ()
{
text = GetComponent<Text> ();
bystanderObjects = GameObject.FindGameObjectsWithTag ("NPC");
foreach (GameObject bystanderObject in bystanderObjects)
{
bystander = bystanderObject.GetComponent<Bystander> ();
}
}
编辑:这表明您对两个框架之间的统一工作方式存在误解。我建议你读一读
您的
Update()
方法将在屏幕上绘制任何内容之前完成。因此,如果覆盖文本的值
,则只会显示最后写入的值。事实上,每个旁观者都需要一个Text
实例场景中应该有多少个旁观者对话脚本实例?每个旁观者一个,或者总共一个?只有一个旁观者对话来管理旁观者的每个实例。这就是我的想法,无论如何,请使用unity3d标签。谢谢你提供的信息,我对这个有点陌生。然而,文本仍然只为其中一个旁观者显示,甚至在更新中将我的旁观者峰值函数放入一个循环中。另外,插入一个Debug.Log
会告诉我,isPlayerNear
触发器对每个单独的函数都有效,但对函数无效。问题似乎出在BystanderSpeak()
函数中。向其中添加调试:void BystanderSpeak(Bystander-Bystander){if(Bystander.speak&&Bystander.isPlayerNear){debug.Log(bystanderSpeech[Bystander.dialogueNumber]);text.text=bystanderSpeech[Bystander.dialogueNumber];}如果(!Bystander.speak&&Bystander.isplayerner){text.text=”“;}
在控制台中显示正确的文本,但不显示在UI文本上。与以前的问题相同:您只有一个文本,而每个旁观者需要一个文本。这里确实没有unity3d特有的问题。只是一些基本的逻辑错误。非常感谢,我想我只是觉得我可以把事情浓缩得比实际情况更多。
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>();
}
}