
一、unity動畫狀態機和代碼控制動畫 哪個好
在Unity中,動畫狀態機和代碼控制動畫各有優勢,無法簡單地說哪個更好。
動畫狀態機(Animator)的優勢:
直觀性和易用性:動畫狀態機通過可視化的界面來管理動畫狀態,使得開發者可以快速地構建和編輯動畫狀態機。適合復雜動畫交互:動畫狀態機允許設置狀態間的過渡和觸發條件,非常適合需要復雜動畫交互的場景,如角色行走、跑步、跳躍等動作的流暢切換。代碼控制動畫的優勢:
靈活性和精確性:通過編寫代碼,開發者可以實現對動畫播放、暫停、繼續、速度調整等操作的精細控制。動態改變動畫狀態:代碼控制允許開發者根據游戲邏輯或玩家輸入來動態地改變動畫狀態,從而實現更加豐富的交互效果。實現特殊功能:對于一些動畫狀態機無法直接提供的功能,代碼控制動畫可能更加適合。選擇建議:
如果項目中的動畫交互相對簡單且直觀,使用動畫狀態機可能是一個更好的選擇,因為它提供了直觀且易用的界面來管理動畫狀態。如果項目需要更加復雜和精細的動畫控制,或者開發者希望實現一些動畫狀態機無法直接提供的功能,那么代碼控制動畫可能更加適合。開發者在選擇使用動畫狀態機還是代碼控制動畫時,應根據具體項目的需求和自己的技能水平來做出決策。
二、從目前是技術來看VR游戲開發,是應該用Unity還是UE4好
兩個引擎都學過一陣子,個人覺得還是UNITY靠譜。。UE4的開發流程有點脫離實際。??傊詈笪沂沁x了UNITY,而且覺得自己沒選錯。。
先說UE4:
UE4的優點有兩個,一是畫面好,這點確實是無可厚非,看一眼就知道能甩UNITY幾條街。二是那所謂的的開源,我覺得這一點對于絕大多數人來說,都是看不見摸不著的。除了這兩個優點之外,我覺得它“哪都不好”。UI設計器難用到爆,build慢到了極點。。。但這些都不是我拋棄UE4的最重要理由。。。
Unreal4有個藍圖系統,其實就是個可視化狀態機,號稱“不會編程也能做游戲”。。但只要稍微了解下開發常識,就知道“不會編程做游戲”根本就是個笑話,做個場景漫游,就是極限了。除非將來有重大科技進步,比如量子計算機普及化等原因。否則,就不要指望開發游戲可以不寫代碼了。。。
而除了這個藍圖之外,就只能靠寫底層的C++代碼來實現功能了。。一入底層深似海,沒個十來年的積累,想也別想。。由于并不是所有人都英語八級,所以才需要用金山詞霸。。。同理,不懂底層的人,才必須依賴引擎才能開發游戲。。而對于那些底層大神,用個記事本,直接寫D3D就能做出游戲了。資源可以手動分配,比使用引擎靈活的多,引擎只是拿來"偷懶"用的。。
UE4的尷尬之處就在于,盡管小學生都能用它的藍圖系統,做出個場景漫游之類的小DEMO。。但卻無論如何都做不出真正可以“玩"的游戲。。就更別說上線運營了。。只能由“英語八級”的人,才可以做得出來。。但"英語八級"的人直接就能做翻譯,又何必非要用金山詞霸?
時至今日,別說是個人開發者了,就算是那些跨國游戲公司的UE4項目,最后大多數也都棄坑了。。。所以說UE4的計劃,有點過于超前了,甚至超前到了有點脫離實際的地步。。畫一個“不會編程也能做游戲”的大餅,確實可以吸引不少零基礎小白,但對于有實際開發需求的開發者來說,就只能呵呵了。
再說UNITY:
UNITY畫面比UE4要差不少,但對于大多數開發者來說,用它確實可以開發出一款真真正正可以上線運營的游戲出來。。
初學UNITY3D的話,對于完全零基礎的人來說,會有點無從下手。。因為在不考慮插件的前提下,它沒有“不寫代碼就能做游戲”的功能。。所以學習UNITY3D的人,總要有點編程基礎。。。但所以即便是零基礎小白,也必須先去學語法,打好基礎,再來學UNITY3D。。不要指望可以一步登天。
UNITY的腳本語言是C#,這門語言絕對不是最簡單的。。比PHP,PYTHON,RUBY等語言要復雜很多。。。但它絕對是“適用于游戲開發的語言”之中,最簡單的(并非所有編程語言都適用于游戲開發)。。只要肯用心學,零基礎小白也可以在半年之內掌握C#。。
至于底層知識。。UNITY絕大部分都幫你搞定了。。你不需要“英語八級”,只要把“漢語拼音”學好就夠了。
三、Unity 動畫系列十一 Animator Record 錄制與回放
參考
Unity-Animator深入系列---錄制與回放
學習筆記--- Unity動畫系統
Animator自帶了簡單的動畫錄制,回放功能。但可惜的是不支持持久化的數據輸出。因而不能作為錄像保存。不過這種可以作為競速,格斗類游戲在結束時經常出現的游戲回放,還是比較有用的。
通過Animator Record我們可以記錄角色在一段時間內所執行的所有動作,并在需要時回放這段動作,Animator會記錄動作的執行,過渡,動畫參數。進行回放時,Animator的動畫狀態,狀態過渡,動畫參數值的改變將在回放中復現。
如果是ApplyRootMotion情況下的動作記錄與回放,人物會返回原位置并執行錄制好的動作,再次復現整套動作,以及動作產生的位移,角位移。非ApplyRootMotion下的動作記錄與回放,人物不會被重置位置,而只是復現動作。
進行回放時,任何對Animator狀態機的修改操作均無效(無法修改動畫參數,無法進行狀態切換)。停止回放時,人物會在當前所在的位置停止回放,并返還Animator的操作權。
如果我們使用animator.StartRecording(0),那么recorderStartTime的值會是0,animator.recorderStopTime是所記錄的動畫時間長度。而使用animator.StartRecording(int frame),那么recorderStartTime/animator.recorderStopTime是最后frame幀對應的游戲時間點。
動畫的回放需要我們在使用了animator.StartPlayback();之后,根據recorderStartTime/animator.recorderStopTime,在Upadte中自行修改playbackTime,累加Time.deltaTime來實現。
如果我們需要將animator的播放速度(animator.speed)的改變也記錄并實在回放中復現。我們可以通過將速度的數值實時記錄在一個動畫參數中。當我們進行回放時,由于動畫參數的數值會復現,我們可以在播放方法累加Time.deltaTime時與動畫參數中獲取到的速度數值相乘,從而實現速度改變的記錄和回放復現。
同樣的思路可以對其他一些需要在回放中復現的屬性數值,通過動畫參數的記錄和引用來實現。













