1. 程式人生 > >動態向多個unity物體新增自定義指令碼

動態向多個unity物體新增自定義指令碼

向多個物體新增自定義指令碼,一個一個拖拖得我頭疼,然後就想辦法寫了個指令碼,可以再執行的時候動態向物體新增元件

首先需要一個需要新增指令碼的父物體,給所有的子物體新增指令碼的方式是迴圈遍歷所有的子物體,然後依次給所有的子物體新增上指令碼,注意,新增完指令碼的時候需要手動設定他的enable為false一次,然後在接下來的協程中在設定enable為true,否則的話該指令碼不會觸發enable方法,對下面手動新增的變數元件也就無效了。

具體的程式碼如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AddComponent : MonoBehaviour { 
    public GameObject go ;     //給所有的子元素的物體新增一個指令碼 該物體是所有元素的父元素
    private int count;     //計算所有子元素的個數
    
    
	// Use this for initialization
	void Start () {
        count = go.transform.childCount;    //獲取所有子物體的個數
        for (int i = 0; i < count; i++) {

            //給所有的子物體新增上interavtive指令碼
            go.transform.GetChild(i).gameObject.AddComponent<Peter_InteractiveObj>();
            //給所有的子元素新增objplay指令碼
            go.transform.GetChild(i).gameObject.AddComponent<Peter_ObjPlay>();

        }
        for (int i = 0; i < count; i++) {

            //給指令碼中的變數賦值
            go.transform.GetChild(i).gameObject.GetComponent<Peter_ObjPlay>().m_InteractiveObj = 
                go.transform.GetChild(i).gameObject.GetComponent<Peter_InteractiveObj>();
        }
        for (int i = 0; i < count; i++) {

            //使指令碼的enable設定為false,因為如果在start中就直接enable,會導致接下來的物體賦不上
            go.transform.GetChild(i).gameObject.GetComponent<Peter_ObjPlay>().enabled = false;
        }

        StartCoroutine(Enable());   //啟動協程
            
	}
    IEnumerator Enable() {    //協程,enable指令碼
        for (int i = 0; i < count; i++)
        {
            go.transform.GetChild(i).gameObject.GetComponent<Peter_ObjPlay>().enabled = true;
        }
        yield return null;
    }
	
	// Update is called once per frame
	void Update () {
		
	}
}

該指令碼被寫死了,可以修改一下自定義新增的指令碼