unity中,經常有物件或預製體,但是想要把某個預製體或物件的元件全部都拷貝到某個新的物件上。
unity 雖然已經提供了copy component這個功能,
這個功能很不錯,可以拷貝貼上,但是面對某個元件上大量的元件和裡面的各種引數調整,
物件或預製體的層級結構深,各層的元件多,引數也紛繁複雜,這個就不太靈光了。
* 怎麼辦呢?
網路上查出了, asset store上面有這個東西,所可以拷貝的。但是居然要求要5刀啊!!
哎呀,不科學啊!!**就不給出了,因為有我,他們就不再被需要了。
咋辦?道理很簡單,不就是複製和貼上麼?
哈哈!!先來簡單的,兩步走。
1.拷貝
static component copiedcomponents;
[menuitem("gameobject/copy current components #&c")]
static
void copy()
一句話,就是獲取當前選中的物件的元件,然後儲存於變數中。
2.貼上
[menuitem("gameobject/paste current components #&p")]
static
void paste()}}
這裡面幹了點啥?基本上都是自解釋的句子。使用了unityeditorinternal的componentutility的函式。
copycomponent
pastecomponentasnew
然後在編輯器的gameobject下就可以看到copy current components和paste current components兩個選單了,當然還包括他們的快捷鍵。
由於擔心與其他快捷鍵重複,所以ctrl,shift,alt都是用上了。當然你可以根據自己喜好來決定。
上面的當前層的拷貝,已經把當前拷貝乙個層的問題解決了。
深度拷貝,當然要深入到物件或預製體的所有子物件進行拷貝了。
1. 建立了乙個鍊錶來解決層級的問題。
public
class mycomponentlist
public listgameobjlist;
public listnextlist;
}
2.拷貝物件元件,包括所有子物件元件內容
static mycomponentlist pri_my_list = new mycomponentlist();
private
static
void
getallchilds(gameobject transformforsearch, mycomponentlist next)
foreach (transform item in transformforsearch.transform)
return;
}[menuitem("gameobject/copy all components #%&c")]
static
void copy()
3.選擇新物件貼上拷貝內容
private
static
void
pastechildcomponent(gameobject gameobj, mycomponentlist next)
}if (next.nextlist != null)
int i = 0;
foreach (var item in next.nextlist)
i++;}}
}
稍微羅嗦一下,深度拷貝與貼上元件都使用了遞迴呼叫。
貼上的遞迴過程中,首先貼上了當前層級的所有元件,方法仍舊使用的是第一種拷貝貼上的方法。
然後遍歷子物件中的物件,遞迴呼叫。
就是這樣。
物件陣列的深拷貝和物件的深拷貝
1 對於 普通陣列 陣列元素為數字或者字串 深拷貝很簡單,拷貝之後兩個陣列指標指向的儲存位址不同,從而完成深拷貝 var test 1,2,3 原陣列 var testcopy concat test 拷貝陣列 testcopy 0 4 console.log test 1,2,3 console....
物件深拷貝
最近在專案中用到了物件拷貝這一塊,而且用到的是物件的深拷貝。下面就讓我們來看一下關於物件的拷貝 淺拷貝和深拷貝。先看一下深拷貝和淺拷貝的區別 概念 js 中的淺拷貝與深拷貝,只是針對複雜資料型別 object,array 的複製問題。淺拷貝與深拷貝都可以實現在已有物件上再生出乙份的作用。但是物件的例...
js 物件深拷貝 深拷貝與淺拷貝
前言 最近在複習一些面試的知識點,剛剛好複習到了這一部分,於是就寫下這篇文章記錄一下。一 值型別和引用型別 在學習深拷貝和淺拷貝之前,我們先來了解一下js的變數型別。值型別 vs 引用型別 值型別 值型別主要有 number,string,boolean,symbol,null,undefined ...