遍历父物体下所有子物体的几种方式

1、通过标签来寻找 

复制代码
1
2
3
4
5
6
7
8
9
void  ForeachObjs()
     {
         //GameObject objs[] = GameObject
         objs = GameObject.FindGameObjectsWithTag( "Cube_00" );
         foreach  (GameObject obj  in  objs)
         {
             obj.AddComponent( "OnTiggerEnterSendMessage" );
         }
     }
2、通过Transform来寻找并附加脚本 

 
复制代码
1
2
3
4
foreach  (Transform child  in  gameObject.transform)
        {
            child.gameObject.AddComponent( "OnTiggerEnterSendMessage" );
        }
3、另外一种方式(转) 

复制代码
1
2
3
4
5
6
7
8
9
10
11
//把这个函数放到你的代码中 check代表你要查询的物体 name为名称 如return GetTransform(transform,"bone12");
      
Transform GetTransform(Transform check, string  name)
{
   foreach  (Transform t  in  check.GetComponentsInChildren<Transform>())
   {
     if (t.name==name){ return  t;}
     GetTransform(t,name);
   }
   return  null ;
}
4、 Unity 访问其他游戏物体的几种方法 (转) 

很多高级游戏代码不仅仅控制单一物体。Unity脚本接口有很多方法获得和访问其他游戏物体和组件。下面我们假设有一个名为OtherScript.js的脚本附属于场景中的游戏物体。 
var foo = 5; 
function DoSomething ( param : String) { 
print(param + " with foo: " + foo); 

1.使用检视视图指定参数。  
你能通过检视视图为一些游戏类型指定变量: 
// Translate the object dragged on the target slot 
var target : Transform; 
function Update () { 
target.Translate(0, 1, 0); 

也能显示参数在其他物体检视视图。下面你能在Inspector面板中拖拽包含OtherScript的游戏物体到target上。 
// Set foo DoSomething on the target variable assigned in the inspector. 
var target : OtherScript; 
function Update () { 
// Set foo variable of the target object 
target.foo = 2; 
// Call do something on the target 
target.DoSomething("Hello"); 

2.通过继承结构  
你能通过Transform组件获得一个子和父物体到现在的物体。 
// Find the child "Hand" of the game object 
// we attached the script to 
transform.Find("Hand").Translate(0, 1, 0); 
你只要在hierarchy面板建立了transform,你就能用GetComponent去获取other scripts。 
// Find the child named "Hand". 
// On the OtherScript attached to it, set foo to 2. 
transform.Find("Hand").GetComponent(OtherScript).foo = 2; 
// Find the child named "Hand". 
// Call DoSomething on the OtherScript attached to it. 
transform.Find("Hand").GetComponent(OtherScript).DoSomething("Hello"); 
// Find the child named "Hand". 
// Then apply a force to the rigidbody attached to the hand. 
transform.Find("Hand").rigidbody.AddForce(0, 10, 0); 
你可以循环到它所有的子物体。 
// Moves all transform children 10 units upwards! 
for (var child : Transform in transform) { 
child.Translate(0, 1, 0); 

查看文档Transform类 可以获得更多信息。 
3.通过名字或标签  
你能用确定的标签搜索物体,使用GameObject.FindWithTag 和GameObject.FindGameObjectsWithTag。使用GameObject.Find通过名字获得游戏物体。 
function Start () 

// By name 
var go = GameObject.Find("SomeGuy"); 
go.transform.Translate(0, 1, 0); 
// By tag 
var player = GameObject.FindWithTag("Player"); 
player.transform.Translate(0, 1, 0); 

你能使用GetComponent获得脚本或组件在找到的游戏物体上。 
function Start () 

// By name 
var go = GameObject.Find("SomeGuy"); 
go.GetComponent(OtherScript).DoSomething(); 
// By tag 
var player = GameObject.FindWithTag("Player"); 
player.GetComponent(OtherScript).DoSomething(); 

一些特殊对象如主摄像机有快捷方式,可以使用Camera.main。 
4.传递参数  
一些事件中包含详细的事件。例如:扳机事件传递(碰撞)Collider组件到碰撞物体的handler函数。 
OnTriggerStay给我们一个碰撞参数.从碰撞体我们能给他赋一个刚体。 
function OnTriggerStay( other : Collider ) { 
// If the other collider also has a rigidbody 
// apply a force to it! 
if (other.rigidbody) { 
other.rigidbody.AddForce(0, 2, 0); 


或者我们可以获取游戏中碰撞者包含的任意组件。 
function OnTriggerStay( other : Collider ) { 
// If the other collider has a OtherScript attached 
// call DoSomething on it. 
// Most of the time colliders won't have this script attached, 
// so we need to check first to avoid null reference exceptions. 
if (other.GetComponent(OtherScript)) { 
other.GetComponent(OtherScript).DoSomething(); 


注意上面的例子,使用其他变量上的后缀,你能获取一些碰撞物体里的组件。 
5.某个类型的所有脚本  
从一个类找到任意对象或脚本,用Object.FindObjectsOfType或获得某个类型的第一个物体使用Object.FindObjectOfType. 
function Start () 

// Find the OtherScript which is attached to any game object in the scene. 
var other : OtherScript = FindObjectOfType(OtherScript); 
other.DoSomething(); 




--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
5、自己写的深度优先遍历,找物体的孩子并做些什么事情 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using  UnityEngine;
using  System.Collections;
using  UnityEditor;
  
public  class  ChangeMeshRenderQuality : Editor
{
     [MenuItem( "GameObject/ChangeMeshRenderQuality" )]
     static  void  FindChildMeshRender()
     {
         Debug.LogWarning( "Change Now!!!" );
         Transform[] selection =  Selection.GetTransforms( SelectionMode.TopLevel | SelectionMode.Editable);
         foreach (Transform t  in  selection)
         {          
             ChangeQuality(t);
         }
     }
      
     static  void  ChangeQuality(Transform T)
     {
         for ( int  i = 0 ; i < T.childCount; i ++)
         {
             Transform childTransform = T.GetChild(i);
             if (childTransform.GetComponent<SkinnedMeshRenderer>() !=  null )
             {
                 childTransform.GetComponent<SkinnedMeshRenderer>().quality = SkinQuality.Bone4;
             }
             ChangeQuality(childTransform);
         }
     }
      
     // Disable the menu if there is nothing selected
     // 如果什么都没有选择将禁用菜单功能
     [MenuItem ( "GameObject/ChangeMeshRenderQuality" true )]
     static  bool  ValidateSelection()
     {
         return  Selection.activeGameObject !=  null ;
     }
  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值