【发布时间】:2017-10-22 13:38:11
【问题描述】:
我将 C# 脚本附加到场景中 NPC 的触发器。基本上我只是试着让我的 NPC 与玩家“交谈”。如果玩家在 NPC 的触发器内并按下“E”键,那么 NPC 应该说出第一条未告知的消息,定义在我的数组 messages
消息在 3 秒后消失,然后用户可以再次激活 NPC,并且应该选择并返回数组中的下一条消息。
为了解决这个问题,我创建了一个 bool 数组 messageStatus,它保存了消息已被告知的状态。
所以messages的索引0对应messageStatus的索引0。
我编写了一个名为selectMessage 的函数,我在其中传递了两个数组,然后获取状态数组的第一个索引位置,其中值为false,然后返回带有该索引的消息。然后我将该索引上的状态设置为true,因为消息已被告知。
但是,初始化 (status[i] = true;) 似乎并未更改原始数组,而只是更改了参数。因为我的 NPC 总是告诉最后一条消息。
我认为我必须将数组作为指针传递,但我不确定这是如何工作的,我的尝试到目前为止都失败了。
我该如何解决这个问题?
string selectMessage(string[] messages, bool[] status)
{
for (int i = 0; i <= status.Length-1; i++) {
if (status[i] == false) {
status[i] = true; //<-- problem
return messages[i];
}
}
return "Is everything ok?";
}
完整脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TalkMalon : MonoBehaviour {
public float displayTime = 3;
public bool showMessage = false;
public string[] messages = {
"Hello, my name is Heinrich.",
"I have nothing more to say."
};
public bool[] messageStatus = {
false,
false
};
void Update()
{
if (showMessage) {
displayTime -= Time.deltaTime;
if (displayTime <= 0.0) {
showMessage = false;
displayTime = 3;
}
}
}
void OnTriggerStay()
{
if (Input.GetKeyDown(KeyCode.E)) {
showMessage = true;
}
}
void OnGUI()
{
if (showMessage) {
GUI.Label(new Rect(Screen.width / 2, Screen.height / 2, 200f+100f, 200f), selectMessage(messages, messageStatus));
}
}
string selectMessage(string[] messages, bool[] status)
{
for (int i = 0; i <= status.Length-1; i++) {
if (status[i] == false) {
status[i] = true;
return messages[i];
}
}
return "Is everything ok?";
}
}
【问题讨论】:
-
使用C#的
ref参数支持。 -
与您的问题略微无关,但为什么不创建一个小类,其中包含描述是否被告知的消息和布尔值。然后你有这些而不是 2 个集合?
-
使用上面 Dave 的建议或使用
KeyValuePair。 -
这里到底有什么问题?
-
谢谢你的提示,我真的很感激他们 :) 问题是我的 NPC 总是告诉最后一条消息
标签: c# arrays pointers unity3d unity5