【问题标题】:Enable/disable mesh renderer of multiple gameobjects启用/禁用多个游戏对象的网格渲染器
【发布时间】:2016-10-15 20:31:24
【问题描述】:

当玩家进入对撞机时,如何启用/禁用多个游戏对象的网格渲染器?这是我的代码,但它不起作用。

using UnityEngine;
using System.Collections;

public class SueloManager : MonoBehaviour {

private GameObject suelo;

void Start ()
{
    suelo = GameObject.FindGameObjectsWithTag ("SueloWireframe");
}

void OnTriggerEnter(Collider other)
{

    if (other.gameObject.tag == "Player") {

        suelo.GetComponent<Renderer> ().enabled = false;
        Debug.Log ("Oculta suelo");

    }
}

void OnTriggerExit(Collider other)
{

    if (other.gameObject.tag == "Player") {

        suelo.GetComponent<Renderer> ().enabled = true;
        Debug.Log ("Aparece suelo");

    }
}
}

【问题讨论】:

  • 您所说的“多个游戏对象”是什么意思,请解释一下您所说的“不起作用”是什么意思。你看到日志了吗?
  • 在学习游戏引擎之前先学习使用语言。您将FindGameObjectsWithTag 的结果(GameObject 的数组)分配给只能容纳一个的变量。在那之后,你需要一个循环,在所有这些中实际执行一些操作。我同意 Programmer 的观点,显示错误,显示您尝试过的内容,解释预期结果。
  • @Programmer 控制台没有出现错误,但是当玩家进入对撞机时,只有一个对象被禁用。
  • 这不是真的。该代码将无法编译。它应该给你编译时错误。虽然我已经为您提供了答案,但我建议您按照@Kroltan 提到的去做。在继续之前学习基本的 C#。大多数人跳到 Unity 并错过了基本的东西。

标签: c# unity3d unity5


【解决方案1】:

FindGameObjectWithTag 返回单个 GameObject,FindGameObjectsWithTag 返回 GameObject 数组。就像 Kroltan 提到的那样,您必须将 suelo 更改为一个数组,然后使用循环来启用和禁用所有这些。将循环放在一个简单的可重用函数中应该可以简化这一点。看看下面解决方案中的EnableRenderer函数。

private Renderer[] sueloRenderers;

void Start()
{
    GameObject[] suelo = GameObject.FindGameObjectsWithTag("SueloWireframe");
    sueloRenderers = new Renderer[suelo.Length];
    for (int i = 0; i < sueloRenderers.Length; i++)
    {
        sueloRenderers[i] = suelo[i].GetComponent<Renderer>();
    }
}

void OnTriggerEnter(Collider other)
{

    if (other.gameObject.tag == "Player")
    {
        EnableRenderer(sueloRenderers, false);
        Debug.Log("Oculta suelo");

    }
}

void OnTriggerExit(Collider other)
{

    if (other.gameObject.tag == "Player")
    {
        EnableRenderer(sueloRenderers, true);
        Debug.Log("Aparece suelo");

    }
}

void EnableRenderer(Renderer[] rd, bool enable)
{
    for (int i = 0; i < rd.Length; i++)
    {
        rd[i].enabled = enable;
    }
}

【讨论】:

  • 非常感谢您的回答。我是初学者,学的很慢。
猜你喜欢
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多