gpt4 book ai didi

c# - Unity3D Color 多子游戏对象与 c#

转载 作者:行者123 更新时间:2023-11-30 21:26:29 25 4
gpt4 key购买 nike

在我的 Unity 项目中,我想要多个红色的子游戏对象。在多个论坛中,我找到了使用 C# 执行此操作的解决方案,但不幸的是,我找不到适合我的解决方案。

我所有的子对象都有标签“colorChild”。

这是我到目前为止尝试过的:

using UnityEngine;

public class ColorChildObject : MonoBehaviour
{
public GamObject PartentColor;
public GameObject[] coloredChilds;
public Material red;

void Start()
{
if(coloredChilds == null)
// coloredChilds = ParentColor.transform.FindChild("ChildName")
// coloredChilds = ParentColor.transform.FindChild("colorChild")

// coloredChilds = GameObject.FindGameObjectswithTag("colorChild")
// coloredChilds = ParentColor.FindGameObjectswithTag("colorChild")

foreach (GameObject colorChild in colorChilds)
{
colorChild.GetComponent<Renderer>().material = red;
}
}
}

不幸的是,这四个(评论)没有一个对我有用。我希望有人能告诉我该怎么做。

非常感谢

最佳答案

注意

if(coloredChilds == null)

永远不会在这里为真!

public GameObject[] coloredChilds;

是一个序列化字段,因为它是public,因此由Unity Inspector自动初始化为空数组并存储在场景文件中!


要么将其设为private,这样它就不再被序列化了

private GameObject[] coloredChilds;

或更改您的支票,例如像这样的长度

if(coloredChilds.Length == 0)
...

第一个肯定更安全,因为您可能通过 Inspector 添加对象到数组,这些对象甚至没有 Renderer 组件并最终出现异常 ;)


那么前两个甚至无法编译

coloredChilds = ParentColor.transform.FindChild("ChildName");
coloredChilds = ParentColor.transform.FindChild("colorChild");

由于 FindChild 返回单个引用,您希望将其分配给一个数组。 (我不知道你使用的是哪个 Unity 版本,但它也被删除了,你可能更愿意使用 transform.Find 无论如何)。

第二个取决于你想要什么

coloredChilds = GameObject.FindGameObjectsWithTag("colorChild");

会在整个场景中搜索这些 child !

coloredChilds = ParentColor.FindGameObjectswWthTag("colorChild");

仅在 ParentColor 下。

两者都只返回active GameObjects!在这两种情况下,W 都应该是大写的。


现在实际上我不会使用您显然找到的任何解决方案,而是使用 GetComponentsInChildren并简单地做类似的事情

// returns all Renderer references of any children (also nested) of ParentColor
// including the Renderer of ParentColor itself if exists
// by passing true this also returns inactive/disabled Renderers
Renderer[] coloredChildren = ParentColor.GetComponentsInChildren<Renderer>(true);

foreach(var child in coloredChildren)
{
child.material = red;
}

直接不通过对象的名称。

如果需要,您还可以进一步过滤 child ,例如仅使用以 ParentColor 为父级的子级 -> 只有第一级子级才会着色

foreach(var child in coloredChilds)
{
if(child.transform.parent != ParentColor.transform) continue;

child.material = red;
}

或者按照你已经分配的标签去

foreach(var child in coloredChilds)
{
if(!child.CompareTag("colorChild")) continue;

child.material = red;
}

关于c# - Unity3D Color 多子游戏对象与 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59171328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com