输入字段在编辑结束时不显示下拉列表

问题描述 投票:0回答:1

有问题的代码:

using UnityEngine;
using TMPro;

public class SpeakerNameInputHandler : MonoBehaviour
{
    public Speaker speaker;
    public TMP_InputField nameInputField;

    public TMP_Text speakerNameTextMeshPro; // Reference to the TextMeshPro object where speaker name will be displayed

    public void SetSpeakerCustomName()
    {
        string newName = nameInputField.text;
        speaker.SetCustomName(newName);

        // Update TextMeshPro text with the new speaker name
        if (speakerNameTextMeshPro != null)
        {
            speakerNameTextMeshPro.text = newName;
        }
    }
}

我想在最后编辑下拉菜单以使用命令 SetSpeakerCustonName 但是当我使用此编码尝试它时它没有显示并且只有名称和字符串名称 我期待它改变我的扬声器的名称,我制作的扬声器是基于代码的

与上面代码相关的代码:

using UnityEngine;
using System.Collections.Generic;

[CreateAssetMenu(fileName = "NewSpeaker", menuName = "Data/New Speaker")]
[System.Serializable]
public class Speaker : ScriptableObject
{
    public string speakerName;
    public Color textColor;

    public List<Sprite> sprites;
    public SpriteController prefab;

    public void SetCustomName(string newName)
    {
        speakerName = newName;
    }
}

更新

是的,故事文件夹中列出了超过 1 个发言者(我正在制作视觉小说游戏)

演讲者文件夹:

图像与检查员、场景和层次结构一致:

最终编辑中的功能图像:

麦克男督察:

c# unity-game-engine unityscript
1个回答
0
投票

好的,我想我可以理解这种困惑,我会尝试解释一下。但首先,由于这会有点长,我将从与包含历史事件的答案的结构相反的方式开始,首先从 TLDR 开始,然后进行 TSNMI(太短,需要更多信息)。

TLDR:太长,没看完

对于脚本,您不能引用实际的 MonoScript(即作为 C# 源代码资产的内部表示),而是引用它所使用的实例。有关更多信息,请参阅 TSNMI。

对于 MB(MonoBehaviours),您需要拖放使用脚本的 GameObject 的组件(实际上,它将间接引用 GameObject 作为对该组件的持久引用。

在 SO(ScriptableObjects)的情况下,由于它们不会“附加”到 GO 并且不作为场景中的实际对象存在,因此您需要使用构造的 SO 之一(意味着其中之一)使用上下文菜单创建的)。

TSNMI:太短,需要更多信息

推理:

因为这意味着您使用一个实例,所以其结果是它仅适用于 that 对象。简而言之,我们假设您有一个设置游戏中单位名称的事件,例如 RPG 中的英雄,并且该单位显然是一个游戏对象(因此它附加了一个 MB)。假设您正在创建一个队伍,因此您有多个英雄。游戏说“请写下你的队伍中每个英雄的名字”(与视觉小说中的操作类似)。您需要为 InputField 事件引用单个英雄,否则您最终会用相同的名称命名队伍中的所有英雄,对吗?

现在,我们假设您有一个更静态的游戏,例如视觉小说。你有一些角色(所以与我的 RPG 示例中的情况类似),但它们被表示为 SO。那么,你如何命名其中之一而不是全部呢?如果您可以使用该脚本,那么所有角色都将具有相同的名称。因此,游戏知道您只想命名第二个角色的方法是引用第二个 SO 资产。

好的,但是如何处理多项选择?

嗯,您可以复制使用事件的对象(例如文本字段),隐藏所有对象并使用某种逻辑一次显示每个对象。或者您可以偷懒,例如显示 4 个字符的所有 4 个字段,一个在另一个下,然后使用一个按钮“下一步”或其他任何按钮来保存它。如果您想要一种更简洁的解决方案,例如,如果您只想使用一个文本字段,则可以通过编程方式更改事件目标。对于第一个解决方案(多个文本字段),如果您不喜欢,您可以通过使用事件(意味着在单个事件上,添加多个目标,其中一个具有

enable = false
)来执行逻辑,而无需太多代码编码。

奇异案例?

是的。请记住,SO 是作为资产存储的内容。这意味着它会持续存在于您的整个项目中,而不是一个场景中。这意味着它可以在任何地方引用。另一方面,在 SO 中创建自己的“Unity Event”将不允许您引用任何内容。让我们考虑一个示例:当 SO 引用场景 1 中的 MB 时,游戏将如何处理场景 2 中 MB 使用的 SO?从技术上讲这是不可能的,因为场景不再存在并且其中的所有对象都被删除。 但是 GO 可以成为资产吗?是的。使用预制件。但这些案例本身就是一个漫长的讨论。

特殊情况有例外吗?

是的,有一些方法可以处理这个问题,要么使用多个场景,要么使用

UnityEngine.Object.DontDestroyOnLoad()

创建一个特殊的持久场景来“保存”所有持久对象。但这些案例本身就是一个漫长的讨论。这些也会引发一场漫长的讨论。

© www.soinside.com 2019 - 2024. All rights reserved.