datagridview 手动添加的行如何进行重载_【厚积薄发】如何规划UI图标图集
這是第151篇UWA技術知識分享的推送。今天我們繼續為大家精選了若干和開發、優化相關的問題,建議閱讀時間10分鐘,認真讀完必有收獲。
UWA 問答社區:answer.uwa4d.com
UWA QQ群2:793972859(原群已滿員)
本期目錄:
如何規劃UI圖標圖集
如何在Unity中不使用Native DLL實現進程間通訊
如何通過??運算符給物體添加組件
攝像機跟隨人物被建筑物遮擋半透方案
如何通過腳本向Timeline增加關鍵幀
Q:道具圖標可能有幾百上千個,如果打到同一圖集里,大小都有2048*2048,實際游戲過程中有額外的內存浪費。
按類型拆分也不太好,新手各類道具各一個,所有類型的圖集就都引用了一遍,跟打到一個里沒太大區別。
如果按等級段來規劃,可能會好一點,但是對于像商城或者某些特定UI上展示的圖標,很可能就不是同一個等級段的,也會造成引用好多個圖集的情況。如果按常用或者不常用來分圖集,得要策劃全程來跟進這塊內容,感覺也很容易出問題。
或者直接對這大量的圖標都不打到圖集,都是散圖,這樣雖然不會有太多內存浪費,但渲染效率就低了。
請問下有沒有比較好的方案來處理這個問題?
A:1、如果圖量遠超單屏顯示量,那比較實際的是自己實現動態圖集,也就是圖標是散圖,在運行過程中根據需求實時拼裝成大圖,可以用Render to Texture實現。
2、對于大多數游戲,如果不是常駐畫面的界面,以現在機器的性能,忍受一下DrawCall也非不可。
感謝招文勇@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5c70038e2b3589332f1a4ade
ScriptQ:如何在Unity中不使用Native DLL實現進程間通訊?在Unity中實現IPC遇到了一些問題,主要是.Net 3.5 沒有System.IO.MemoryMappedFiles 這個類,而我在制作Unity Editor插件時要用 File mapping的方式實現 IPC,需要普遍適配各個項目,必須兼容.Net3.5,這樣似乎除了Import C++編寫的DLL之外就沒有什么好的方法了,但插件又是純Editor在用的,所以不想因為這個原因導致游戲無關的DLL可能被打到Build里,所以想請教一下有沒有兼容.Net 3.5的共享內核內存實現IPC的方法。
A1:1、純C#可以socket做IPC,很通用且跨平臺。
2、用Native DLL也可以選擇是否打進包里,至少現在版本Unity可以。
感謝招文勇@UWA問答社區提供了回答
A2:一些和底層比較近的功能還是自己寫Native插件吧,可以通過DLL的Import Setting和宏定義避免你說的問題。
PS:Unity對一些非渲染功能的封裝大多效率不高也不太可控,其他諸如Camera、Microphone等等。
感謝志鵬Zipper@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5c6fd6142b3589332f1a4add
ScriptQ:為什么通過??運算符給物體添加組件添加不上?
public?class?PlayerMoveTest?:?MonoBehaviour
{
????CharacterController?controller;private?void?Awake(){
????????controller?=?transform.GetComponent()????gameObject.AddComponent();
????}
}????
{
????CharacterController?controller;private?void?Awake(){
????????controller?=?transform.GetComponent();if?(controller?==?null)
????????????{
????????????????????controller?=?gameObject.AddComponent();
????????????}
????}
}????????
如上面的代碼,第一段是不行的,controller 顯示為null,而第二段是可以添加上組件的,請問這是為什么?
對于??運算符,難道不是??前面的為null,就會執行??后面的表達式嗎?
A1:我試了下:
public?class?PlayerMoveTest?:?MonoBehaviour
{
????CharacterController?controller;private?void?Awake(){
????????controller?=?transform.GetComponent();if?(controller?==?null)
????????????{
????????????????????controller?=?gameObject.AddComponent();
????????????}
????}
}????????
把上面代碼反編譯:
????if?(GUI.Button(new?Rect(100f,?100f,?200f,?80f),?"Test")?&&?(Object)base.transform.GetComponent()?==?(Object)null)
????{
????????base.gameObject.AddComponent();
????}if?(GUI.Button(new?Rect(200f,?200f,?200f,?80f),?"Test2")?&&?(object)base.transform.GetComponent()?==?null)
????{
????????base.gameObject.AddComponent();
????}???
可以看出2段代碼是不一樣的,第一個比較的是UnityEngine.Object類型,第二個比較的是System.object類型。
再寫段代碼測試下:
?????var?c1?=?(object)base.transform.GetComponent();if(c1?==?null)?????????Debug.Log(1);var?c2?=?(Object)base.transform.GetComponent();if(c2?==(Object)null)
?????????Debug.Log(2);if(c2?==?null)
?????????Debug.Log(3);????
輸出結果是2和3。
斷點調試下這幾個值:
原因是UnityEngine.Object類型重載了==運算符,所以"null"和null認為是相等的,而用System.object類型比較的時候認為是不相等的。
感謝deviljz@UWA問答社區提供了回答
A2:看了一下,發現此"null"非彼null:
其實在contor = transform.GetComponent();執行這句的時候已經賦值了,只不過賦的值是"null",看一下打印的就知道兩個null有什么區別了。
再加一句,當我打印contor的Type時,在one那里,會報對象的引用未設置為實例,而在two的時候會打印他的類型,也就是說 ?? 操作符左邊必須是為未賦值的變量時才會執行右邊的,例子看下面的代碼b,最后打印的是v,c是我定義的一個未賦值的string c。
感謝Marco@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5c7101bc63826a332ad9966c
ScriptQ:攝像機跟隨角色的時候被建筑物遮擋,想讓建筑物半透,這個時候需要射線檢測,但是因為性能問題,場景物體不允許添加Collider組件, 用純Shader寫的時候效果總是有些問題,想請教大神們有沒有其他方案。
A1:一種做法是,場景做的時候用Box Collider做物體形狀的近似來進行物理碰撞的檢測,不知道你們不允許使用添加Collider組件是不是也不允許用這種方式。
不知道你純Shader編寫是什么思路,我感覺單純Shader里是沒辦法處理這個需求的。
不知道有沒有更好的方案,在比較通用又不做很tricky的處理的情況下,感覺物理反而是比較直接、高效的方式。
PS:如果是2.5D的視角,相機不會俯仰的情況下,可以預計算一份2D的數據在Runtime做檢索用,不過這里面有限制和問題,我沒這么做過,這里只是提一句。
感謝賈偉昊@UWA問答社區提供了回答
A2:在Unity 3D里面確實沒有想到比Box Collider來做成場景物體的近似形狀來進行物理檢測更直接的辦法了。
賈偉昊提到可以預計算一份數據做Runtime檢測所用,我想起來在Quake系列里面,場景的渲染和物理碰撞檢測數據是預先烘焙進了BSP樹里面的,Quake在Runtime階段的碰撞檢測是基于BSP的。
感謝張銳@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5c74f9e163826a332ad996e5
TimelineQ:在使用新的Timeline時發現,沒有手動添加關鍵幀的選項/按鍵,也沒有發現相關的API,那應當手動如何添加關鍵幀呢?先謝過各位~
A:在編輯器中,可以通過鼠標拉動Clip的兩邊來在Clip的頭部或者尾部添加關鍵幀,并且編輯器中會顯示出當前操作中+/-了多少幀。
如果是想Runtime向built-in的軌道添加關鍵幀,目前Unity確實沒有提供相關的接口。
可以通過腳本來實現自定義的Track/Clip,在腳本中控制Timeline的Playhead停留在固定的時間,或者是跳到指定的時間。
具體需要自己實現TrackAsset、PlayableAsset和PlayableBehaviour。
其中:
實現TrackAsset用于提供給外部的Mono腳本來操作Track。
實現PlayableAsset用于提供自定義的Clip,用于為Track提供相關數據。
實現PlayableBehaviour,實現控制Timeline播放的控制邏輯。
感謝張銳@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5c6666a92b3589332f1a4a34
今天的分享就到這里。當然,生有涯而知無涯。在漫漫的開發周期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上準備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com
官方問答社區:answer.uwa4d.com
官方技術QQ群:793972859(原群已滿員)
(封面圖來源來源于網絡)
UWA DAY 2019完整議題公布!
近期精彩回顧
【博物納新】Impostor Baker開源庫評測!
【厚積薄發】按鈕穿透點擊實現方式!
【厚積薄發】如何能避免動態字體Font Texture過大!
【萬象更新】看完性能簡報,想不優化好都難!
總結
以上是生活随笔為你收集整理的datagridview 手动添加的行如何进行重载_【厚积薄发】如何规划UI图标图集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: toughradius 配置mysql_
- 下一篇: java注解执行顺序_如何确保java中