【问题标题】:Unity - How to change what GameObjects are visible with button click events?Unity - 如何通过按钮单击事件更改可见的游戏对象?
【发布时间】:2017-07-26 05:15:19
【问题描述】:

我是 Unity 的新手,我正在处理 Augmented reality project,我正在根据工作正常的标记显示 3D 对象。但我想要的是根据点击事件显示不同的对象

这是我到目前为止所做的场景:

  • 我用带有标记的 3D 对象创建了 4 个不同的场景
  • 制作了一个画布框架,我在上面放了 3 个按钮
  • 在每个按钮单击中,我正在加载下一个场景,下面是我编写的代码。问题是它显示黑屏而不是加载新对象。我不想再次加载相机。谁能帮我这个?

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement; // <<<<<< ADD THIS.
    
    public class Button_1 : MonoBehaviour
    {
    
     public void Button_Click()
     {
    Debug.Log("Hello, World!");
    // Application.LoadLevel("Multi Target");
    SceneManager.LoadScene("MultiTarget_1");            // <<<< Then Do this.
    
        }
    
         public void Button_Click2()
         {
        Debug.Log("Hello, World!");
    // Application.LoadScene("Multi Target_1");
    SceneManager.LoadScene("NameOfScene");            // <<<< Then Do this.
    
       }
    
       public void Button_Click3()
      {
        Debug.Log("Hello, World!");
        Application.LoadLevel("Multi Target_2");
    
      }
    
      public void Button_String(string msg)
     {
      Debug.Log("Hello, All!");
      Application.LoadLevel("Multi Target_1");
    
     }
    }
    

image

【问题讨论】:

  • 有人为您添加了 SecenteManager.LoadScene 吗?
  • 我已经尝试过了,但它不起作用你能解释一下我怎样才能做到这一点吗? @IgnacioAlorre
  • 只是为了确定,您想要通过单击按钮更改的是场景而不是对象?当然每个场景都有自己的对象,但是你试着改变整个场景,不是吗?
  • 我只想更改点击事件的对象而不是场景。在一个场景中,我想使用点击事件更改多个对象。
  • 但似乎在您的脚本中,您尝试更改整个场景的每个按钮:SceneManager.LoadScene("NameOfScene");

标签: c# unity3d


【解决方案1】:

如果你在一个场景中有两组对象,例如:

  • GoupA = 汽车
  • B 组 = 行人

并且您希望默认情况下汽车可见而行人不可见,因此一旦您单击按钮汽车在场景中变得不可见并且行人变得可见,您可以做的一件事是为每组分配不同的层对象,然后在按下其中一个按钮时以编程方式更改相机的剔除蒙版。

第 1 步:

您需要在场景中创建两个或更多层,并将这些层分配给场景中的游戏对象,具体取决于您希望在单击按钮后同时显示哪些对象。你需要在这里阅读:

https://docs.unity3d.com/Manual/Layers.html

第 2 步:

在您的代码中创建对场景中活动相机的引用:

Camera cam;

第 3 步:

Button_Click 方法中更改您的逻辑

public void Button_Click1()
{
   // Only render objects in the first layer (Default layer)
        cam.cullingMask = 1 << 0;
}
...

这些是您可以使用剔除蒙版执行的其他操作(取决于您希望如何显示游戏对象):

// Render everything *except* layer 3
camera.cullingMask = ~(1 << 3);

// Switch off layer 3, leave others as-is
camera.cullingMask = ~(1 << 3);

// Switch on layer 3, leave others as-is
camera.cullingMask |= (1 << 3);

您可以在此处阅读更多信息:

https://docs.unity3d.com/ScriptReference/Camera-cullingMask.html

【讨论】:

  • 感谢您的回答。你有任何示例数据吗,我试过你的代码,但不明白它背后的逻辑。
  • 我们可以一键做一件事我们可以在同一场景中隐藏第一个对象以及显示第二个对象。
  • 好的,我再添加一些东西。问题是我在办公室,没有时间编写所有程序,只是一个你可以尝试的简短模板
  • 请检查这个链接,我们已经完成了这个事情,但是我们无法理解下一步我们可以做什么当我们点击 Ring 2 时看到这个图像然后它再次加载相机,这是我的问题ibb.co/nD0hvQ
  • 对不起,我在办公室,无法真正打开外部链接。我需要你在这里描述我的问题。我建议您暂时搁置增强现实的事情,并尝试我在常规 3D 场景中所说的话。在按下一个或另一个按钮后,看看您是否能够从相机中过滤掉游戏对象。 (实际上,我什至会先让它变得更简单,而不是图形界面中的按钮,我会使用关键字中的键来隐藏/显示不同的层)。在 Unity 中,很多事情都会出错,最好是一步一步来,从简单到复杂
【解决方案2】:

您好,我认为您可以通过分组和隐藏游戏对象来修复您的项目。它比您认为的要简单得多...我已经编写了一个示例代码...并且我已经添加了一个链接来执行此操作,以说明如何对对象进行分组,如果您需要帮助...我是增强现实开发人员同样,我了解您遇到的问题..希望这会有所帮助..

网址:https://www.youtube.com/watch?v=MP62CcK-qTc

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; // <<<<<< ADD THIS.




public class Button_1 : MonoBehaviour
{
 public GameObject MultiTarget_1, NameOfScene,Multi_Target_2,Multi_Target_1;

 public void Button_Click()
 {
    Debug.Log("Hello, World!");
    HideAll();
      MultiTarget_1.SetActive(true);

    }

     public void Button_Click2()
     {
    Debug.Log("Hello, World!");
    HideAll();
    NameOfScene.SetActive(true);

   }

   public void Button_Click3()
  {
    Debug.Log("Hello, World!");
    HideAll();
    Multi_Target_2.SetActive(true);

  }

  public void Button_String(string msg)
 {
  Debug.Log("Hello, All!");
    HideAll();
    Multi_Target_1.SetActive(true);

 }

 //call this to hide all
 public void HideAll(){
    MultiTarget_1.SetActive(false);
    NameOfScene.SetActive(false);
    Multi_Target_2.SetActive(false);
    Multi_Target_1.SetActive(false);
 }
}

【讨论】:

  • 我想在屏幕底部显示所有 3 个按钮,但是当我按下任何按钮时,它正在打开相机再次加载的新场景,这是我的问题,我认为它没有显示隐藏东西
  • 我明白了...您为 AR 使用什么插件...我使用 Vuforia developer.vuforia.com/home-page 我在通过 Vuforia 时遇到了同样的问题。我有同样的问题。所以我所做的只是隐藏/显示对象..在我创建的脚本上,你没有加载新场景..你只是隐藏和显示......我知道你要修复相机。但插件不起作用。
  • 也许那个插件的开发者认为人们只会为应用程序使用一个场景......但我们当然不会......你可以尝试修复插件或者你可以尝试使用我创建的脚本.. 或者你可以尝试学习 vuforia....
【解决方案3】:

两件事。首先检查是否给出了正确的场景名称以及是否正在加载。

如果您想在不同的场景中保留相机对象,请使用附加到相机的脚本制作对象DontDestroyOnLoad()

在这里阅读更多: https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html

【讨论】:

  • 你能解释一下它的作用吗?
  • 它将帮助您将相机对象持久化到不同的场景中。
【解决方案4】:

您不需要不同的场景,只需 1 个具有 AR 会话和 AR 会话来源的场景。

  • 创建一个新的空白游戏对象并重置其变换(缩放、旋转、位置),以便所有内容都为 0,除了“缩放”将为 1,
  • 在“BUTTON 1”点击事件期间选择您想要的所有游戏对象,使它们成为您创建的新空白游戏对象的子对象。
  • 对您想要在按钮单击期间更改的所有游戏对象重复相同的操作。
  • 为每个按钮创建每个游戏对象后,将它们设为 PREFABS。 (只需将游戏对象从 The Hierarchy 窗口拖到 project wind 即可看到所有文件)
  • 创建脚本并创建 Gameobect 变量的公共或序列化数组,并保存脚本。

公共游戏对象 obj1[];

  • 如果您不知道使用数组,您可以创建多个(按钮数量/您拥有的父游戏对象)游戏对象变量
  • 将脚本拖放到游戏对象上,在脚本上您会看到您可以拖放与创建变量时指定的名称相同的游戏对象。
  • 在 UI 脚本(按钮单击事件)中,您只需相应地启用和禁用预制件(您创建的变量),

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    相关资源
    最近更新 更多