C# Update()+Raycast+标记在单击鼠标时导致游戏对象识别错误

C# Update()+Raycast+标记在单击鼠标时导致游戏对象识别错误,c#,unity3d,C#,Unity3d,我正在调试这个,但到目前为止我还没有真正取得任何进展 我的设置:我在运行时生成了预置;它们都带有npc_实体的标签来识别它们。 当我点击其中一个时,我想获取附加到gameobject我的自定义实体类的一个组件中的数据。我通过更新功能中的光线投射来实现这一点,使游戏对象达到生命点 现在有一个奇怪之处:我使用raycast在游戏窗口中点击一个特定的实体;并读取参数。如果只实例化了一个实体,则一切正常;但如果有2个或更多,则会多次调用更新,这会导致每次都覆盖数据 我有一个带有更新功能的脚本,它可以对预

我正在调试这个,但到目前为止我还没有真正取得任何进展

我的设置:我在运行时生成了预置;它们都带有npc_实体的标签来识别它们。 当我点击其中一个时,我想获取附加到gameobject我的自定义实体类的一个组件中的数据。我通过更新功能中的光线投射来实现这一点,使游戏对象达到生命点

现在有一个奇怪之处:我使用raycast在游戏窗口中点击一个特定的实体;并读取参数。如果只实例化了一个实体,则一切正常;但如果有2个或更多,则会多次调用更新,这会导致每次都覆盖数据

我有一个带有更新功能的脚本,它可以对预置本身进行光线投射;代码如下:

void Update()
{
    // using this to select entities
    if (Input.GetMouseButtonDown(0) && Camera.main.name == "top_Camera")
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out hit, raycast_length) && hit.collider.gameObject.tag == "npc_entity")
        {
            selected_target = gameObject;
            Debug.Log(selected_target.name + " " + selected_target.GetComponent<AIPlayer>().connected_player.playername);
            UpdateNPCUI();
        }
    }
}

void UpdateNPCUI()
{
    ui_manager.NPCpanel.GetComponentInChildren<CanvasGrou>().alpha = 1;
    NPC_name.text = selected_target.GetComponent<AIPlayer>().connected_player.playername);

}
我不明白的是,为什么我会得到这样的行为,所有实例化的游戏对象基本上都是经过处理的。我在游戏对象上单击一次,光线投射显示位置与游戏对象所在的位置一致;其他人离它还很远


如有任何建议,将不胜感激;甚至一步一步地调试;我看不出这个问题。

因此,每次数据都会被覆盖,因为每个预置上都有脚本

您不需要将此脚本附加到每个实例,此代码可以在任何其他单实例游戏对象上,并且只会触发一次。将此脚本放在GameManager游戏对象或只有一个实例的对象上

要仅获取当前游戏对象,而不是所有游戏对象,请执行以下操作:

// using this to select entities
if (Input.GetMouseButtonDown(0) && Camera.main.name == "top_Camera")
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;

    if (Physics.Raycast(ray, out hit, raycast_length) && hit.collider.gameObject.tag == "npc_entity")
    {
        selected_target = hit.collider.gameObject;
        Debug.Log(selected_target.name + " " + selected_target.GetComponent<AIPlayer>().connected_player.playername);
        UpdateNPCUI();
    }
}

此脚本在inspector中附加到什么?您的问题还不太清楚,是不是该方法正在运行多次,并且值被覆盖?此脚本附加到预置;因此,当我实例化实体时,每个实体都会有这个脚本。据我所知,问题是我有N个实体,有N个脚本,每个实体显然都在自己的脚本上调用更新脚本,这会导致数据被覆盖。我试图只在我点击的单元上触发点击,但没有发生。你应该把你的Raycast脚本放在其他东西上,可能是一个单一控制器类型的游戏对象。哦,就是这样?每次更新都是通过光线收集鼠标坐标?我认为,一旦第一次更新发生,鼠标就不会再被按下,所以它不会捕捉任何其他实体;我可以将其添加到我用于应用程序的主游戏管理器上;它们总是存在的。现在就试好了,我确实试过了,到目前为止,效果不错,我确实错过了hit.collider。游戏对象在你的回复中。谢谢