C# gameObject的多个实例的执行方式不同

C# gameObject的多个实例的执行方式不同,c#,unity3d,gameobject,C#,Unity3d,Gameobject,因此,在我的游戏世界中,我有三个不同的“旁观者”,每个人都有一个附加的“旁观者”脚本,并且在我的UI中有一个“旁观者对话”元素。其想法是,当玩家进入任何旁观者的范围时,会显示从数据库中随机选择的文本,但对于我的脚本,它只对其中一个旁观者有效 我觉得我交叉引用的脚本太多了,但我不知道。以下是代码的两部分: using UnityEngine; using UnityEngine.UI; using System.Collections; public class Bystander : Mono

因此,在我的游戏世界中,我有三个不同的“旁观者”,每个人都有一个附加的“旁观者”脚本,并且在我的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;
    }
}
}
使用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>();
    }
}