如何評價 Unity 2017?

GDC 2017上的Keynote:

https://www.youtube.com/watch?v=YHweZ8dhOJAfeature=youtu.bet=21s


Natalya Tatarchuk,業界圖形學大神,現在跑到unity去做高管了。主要推進自定義渲染管線和自動化內容生成。自動內容生成的思路就是通過工具先做大部分基礎工作,結合PCG技巧快速生成內容,再靠artist控制最終效果。就是所謂的民主化高精度的內容創造。還是挺期待這部分內容的,尤其是小團隊,生產內容額外困難。這也是像解決業內終極問題在努力。

現在Unity的那個Head of Cinematics叫Adam Myhill,之前在Blackbird做Homeworld: Desert of Karak的自動相機系統。Unity新的相機系統,應該就是他在Desert of Karak基礎之上完成的。這其實也算是自動化內容的一部分,可以叫做procedural camera animation,跟tatarchuk的大方向非常吻合。具體見keynote 1:35:38,如果想體會一下這套東西實際在遊戲里是怎麼發揮作用的,可以參考Desert of Karak的2015 GDC Talk: https://www.youtube.com/watch?v=QNR9Nvjsv9Y

新增的那個光照聚合的界面其實很不錯,我一直想做一個針對material的。unity很大問題是workflow非常程序員化,搞的程序員都跟td一樣,什麼都要集成。但是如果想in-engine調出好效果,方便美術使用的界面必須要有。unity在workflow和usability上還有海量的提升空間,比如:

  • 至今都還沒有統一管理hotkey的方式,也不解決mac和win上hotkey映射不同問題。
  • inspector是個singleton跟project窗口配合起來要頻繁切換太煩人。
  • prefab嵌套要依賴第三方插件,原生連補充嵌套功能都要重新實現編輯器界面。
  • 場景合併非常困難。
  • 動畫編輯器的交互一坨翔
  • 沒有有效地插件管理,導入插件之後變成零散文件,刪除起來非常困難。
  • 等等等等。

這些雖然是非常細節的功能,但是日常使用的時候充滿了摩擦力,讓你無法忘記工具的存在。

如果延續natarchuk的思路,unity應該革新現在asset store的運作方式。如果有海量的數據和內容作為基礎,這本身就是一種很有效的pcg。很久以前做cocos的時候,一個第三方particle editor,內置了很多其他用戶上傳的particle模版,雖然內容參差不齊,但是都可以直接使用,作為修改的基礎。而且通過觀察別人編輯的內容,我可以很快的學習編輯技巧和設計思路,進一步提升產出。unity應該仿照類似,把particle,material,shader,動畫,mocap數據等資源垂直嵌入到遊戲編輯界面內,方便提取內容模版進行編輯,而不是現在asset store這種嘗試成本很高的方式。當然兩者也可以是平行的。


ScriptableRenderLoop 應該是一個重要轉折點。以後圖像程序員在 unity 上可發揮的餘地將大大增加,從而帶來更好的畫質和更好的性能。很看好 Unity 5.6。

聯繫到 DICE 的 FrameGraph,以後這種可定製化的渲染管線將是主流。UE4 這種想靠一套管線吃遍所有類型的設計會慢慢被淘汰的。

====================================

補充一下 ScriptableRenderLoop 的文檔:

https://docs.google.com/document/d/1e2jkr_-v5iaZRuHdnMrSv978LuJKYZhsIYnrDkNAuvQ/edit

在「一個渲染管線吃遍天」的設計下,Unity 為了兼顧老版本和低端機,渲染管線只能採用落後的 DX9 形式 forward shading 或者 light volume deferred lighting,甚至 HDR pipeline 都不是標配。在可訂製化渲染管線出現後,新版本就可以不再顧及低端版本,在高級渲染上會有更大的發展,同時低端渲染也可以繼續保留。

5.6 中已經正在開發的,基於 ScriptableRenderLoop 的 New built-in 「HD Render Loop」 應該會對商業引擎市場產生很大衝擊:

1. HD render loop 如果都實現了文檔里說的東西,畫質不會輸給 UE4。一般團隊可以直接當作 out of box 的解決方案做端游或者工業渲染。

2. 原本低端的渲染管線仍然保存,做低端平台的團隊可以當作什麼事情都沒發生。

3. 有開發能力的團隊可以定製自己所需的管線,無論是高端還是低端的。HD Render Loop 中有不少 feature 已經是 state of the art 解決方案了。

====================================

再補充一下 https://twitter.com/BrianKaris/status/838072258639740928

似乎 UE4 也正在開發類似於 frostbite 的 Frame Graph。以後可定製化的渲染管線應該就是通用引擎的發展趨勢。


這裡主要說下Timeline吧~

曾經

製作遊戲經常會用到劇情系統,就算沒有劇情系統也會有即時演算的動畫存在。在之前Unity要完成這些工程要麼使用劇編插件再搭配攝像機插件,甚至用非常多的狀態機來做。而現在Unity3d有了Timeline 和Cinemachine,一切變得容易了很多。

現在網上的教學資源較少,可以在http://edu.csdn.net/huiyiCourse/detail/453看看直播。

我這裡下載Timeline_Market的Demo資源,鏈接在下面,有興趣的朋友可以下載來研究研究

http://pan.baidu.com/s/1c17OMTM 密碼:s9s1

我這看完了視頻後花了30分鐘實踐了一下,總的來說不算太難。

現在開始半教學模式~

首先得有一個Timeline的組件

然後給Timeline點擊添加一個動畫控制

這裡需要把場景裡面的帶有Animator組件的物體拖到Track上,這裡必要的說明一下,Timeline並不需要動畫控制器中的動畫狀態,那怕空的資源也是可以的。如果是空的Animator組件,可以點擊紅色錄製按鈕,像操作動畫Animation動畫一樣的製作動畫。

我們可以右鍵添加動畫Clip,這裡的資源是在工程中的。同時添加的動畫可以在Timeline中做混合處理

添加後直接播放的效果:

Timeline動畫功能搞定~

我們還可以自定義腳本:

然後創建一個 PlayableBehaviour類型的腳本

腳本內容如下,主要注意得通過Resolve(playable.GetGraph().GetResolver())方法去獲得Timeline傳入的值。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
using UnityEngine.UI;

public class NewPlayableAsset : BasicPlayableBehaviour
{
[Header("對話框")]
public ExposedReference& dialog;
private Text _dialog;
[Multiline(3)]
public string dialogStr;

public override void OnGraphStart(Playable playable)
{
_dialog = dialog.Resolve(playable.GetGraph().GetResolver());
}

public override void OnBehaviourPlay(Playable playable, FrameData info)
{

_dialog.gameObject.SetActive(true);
_dialog.text = dialogStr;
}

public override void OnBehaviourPause(Playable playable, FrameData info)
{
if (_dialog)
{
_dialog.gameObject.SetActive(false);
}
}
}

然後和動畫一樣插入Track後可以看到下方的屬性是我們可以編輯的了。

做一個文本變換的效果:

腳本自定義功能也完成~

之後修改成條件觸發判定,不在是直接播放遊戲就開始運行

做了一個觸發的腳本功能

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Timeline;
using UnityEngine.Playables;
public class StoryControl : MonoBehaviour
{

public bool isTrigger;

public GameObject ui_tip;

public PlayableDirector playableDirector;

public void OnTriggerEnter(Collider other)
{
if (other.gameObject.name == "Trigger")
{
ui_tip.gameObject.SetActive(true);
isTrigger = true;
}
}

public void OnTriggerExit(Collider other)
{
if (other.gameObject.name == "Trigger")
{
ui_tip.gameObject.SetActive(false);
isTrigger = true;
}
}

public void Update()
{
if (isTrigger)
{
if (Input.GetKeyDown(KeyCode.E))
{
playableDirector.Play();
}
}
}

}

之後我們可以運行看效果了:

最後還有一個Cinemachine插件和Timeline的結合(Cinemachine的作者投靠了Unity),這個插件可以在AssetStore上免費下載。

首先添加

創建攝像機後設置,具體Cinemachine的功能這裡不多介紹了,一款非常不錯的專業攝像機控制插件。

順便將主角屏蔽掉,通過ActivationTrack的功能

最後是這樣的效果

總結

現在相關教學還是太少,希望Timeline能在更多的項目中運用起來。畢竟更加好用專業的工具能帶來效率和質量的提升,如果只是升級Unity版本,而不去了解更新的功能還不如繼續保持舊版本的穩定。

關於Timeline的學習, 感興趣的可以來我們遊戲開發交流群:610475807,互相交流~


一直沒空看,直到上周才找時間看完。

對於功能方面,其實也沒太多覺得驚艷的。

  • NavMesh 又升級了,只是現在還沒有特別完善的框架,還是先觀望,繼續用 RAIN,等 Unity6之後再考慮換 。

  • Unity 直接發布到小米商店,直接發布到 Facebook。目前看來只是商務上的拓展,技術上其實沒有本質的突破。要是能把 Unity 的 Runtime集成到小米內核或者是 Chrome 瀏覽器里,那才是革命性的變化。

  • 對 VR 的支持也是中規中矩。PSVR 和 Oculus 還 OK,但Google Daydream 我個人表示不看好,說不定一年以後就不存在了。為什麼沒有提Hololens,跟微軟的蜜月期已經過了么?
  • 有個女的在台上說了很長時間,希望把內容製作更多納入 Unity 里,尤其是針對美術工作者。過去幾代他們也的確是這麼做的,但是吧,效果其實很普通,很多強加進去的功能還沒有第三方插件做得好,更別提挑戰專業軟體了。我只希望官方要推新功能時,先以插件的形式先發布,等完善之後再加入到 Unity 內核里。或者直接出一個實驗室版的 Unity 分支。別像現在這樣,5.0之後由於一下子加了太多東西,動不動就崩潰,逼著用戶不斷裝 patch 版,裝完之後舊的問題解決了,又帶出一堆新的 error,實在是不爽。
  • 官方的渲染視頻和 Cutscene 案例都不錯,普通人在 Unity 里做電影指日可待。

倒是好羨慕開頭那幾個團隊。

一個靠主機遊戲做到公司 IPO。

一個做 COC like 遊戲,做到每個月500w 刀。

一個靠幾個成員遠程協作,在 mobile 和 vr 時代都出了小而美的代表作。


平民化了太多頂尖功能


自定義管線,看上去很美。能自己寫DICE的那套,拿有源碼的虛幻還能比沒源碼的unity難寫?unity屬於典型的看上去啥都能寫,腳本嗎,想掛哪掛哪.但是真正需要你關心的地方,好,又是黑盒了。虛幻看起來各種套路組合好了,但是有了源碼,其實隨意改嘛。


回頭晚上來填坑

買了個機械臂拼的上癮停不下來。。 剛剛把舵機裝反,終於想到過來補一下

然後發現大家都說的差不多了。。 似乎也沒啥可以補。。

啊啊 有

介紹timeline editor時候出現的這個遊戲

作者是我很喜歡的一個TD,原來是搞影視的忘記是ilm還是dreamwork了

我記得至少六年前 他就用cryengine開發這款遊戲了。。

然後在蹉跎了多年後 去年開始用unity做....

其他的,其他的我沒興趣,我就等Octane的unity插件啥時候出!


多線程的引入+Vulkan+ScriptableRenderLoop,Unity手游的畫質上限又可以拉高一檔了,大廠有了更大的發揮空間來拉開產品檔次了,對於不注重技術積累的中小廠來說日子大概要更難過了吧……

相比於Unity5那個手游上不太容易上的PBR+GI,這一次的改動方向實際上對現在的手游業態衝擊更大,所以Unity這一批的版本授權費還算收的合理……

不過如果仔細考察Unity過往每一個具有實際意義的大系統從誕生到實際可用所需要的時間,我估計這些衝擊大概要至少到2018年才會顯現出來吧2333333


前面有人說的ScriptableRenderLoop的確不錯,但與畫質,效率似乎無直接關係,只是提高了擴展性和可維護性


難道沒人覺得unreal要更令人興奮嗎。。。


Unity2017的Lighting改的看不懂了,誰能來講解一下??


其實這幾年unity一直在進步,所以2017從內容上看算是穩中提高。當然安全的多線程是我個人最喜歡的,畢竟協程這個東西不是真多線程。還有就是Timeline這個功能,目前還不是很確定是幹嘛的。


timeline感覺有意思,ScriptableRenderLoop給圖形程序員更大的擴展空間,從而能更大發揮他們的作用,總之希望能朝著頂尖商業引擎的路走下去。

有沒有人做是一回事,能不能做是另一回事。


樓上都在說渲染的事情啊,我說點其他方面。

上手非常容易,C#語言沒指針自動回收內存,公司招人可以省成本。

腳本組件一套設計也很強大。

第三方插件支持的也到位,生態很好。

跨平台支持,遊戲打包很方便。

更新維護的到位,新機器支持的好。

說個缺點,個人版的皮膚時間長了刺眼睛,能給黑皮膚更好了。


不能使用多線程簡直是要死掉了


我就想知道官方文檔什麼時候能出中文版,路演開大會什麼的都是扯淡


untiy是最初開始是opengl所以你們明白一點,渲染管線的問題

我就換一個說一下你們所說的untiy用C#寫顏色的演算法不可能。

這是gdi+的處理方式,雖然不是gui但是也能看出點問題

對於顏色來說是要通過載入某些方法才能實現對於在它本身來說基本顏色有關的,用顏色漸變的梯度刷填充形狀 ,灰階,其他的顏色演算法基本很難達到。這是有關用顏色漸變的梯度刷填充形狀寫法

Status SetCenterColor(const Color color); // 設置刷中心顏色 Status SetSurroundColors(const Color *colors, INT *count); // 設置路徑點顏色 Status GetCenterColor(Color *color); // 獲取刷中心顏色 INT GetSurroundColorCount(VOID); // 獲取路徑點顏色數目 Status GetSurroundColors(Color *colors, INT *count); // 獲取路徑點顏色數組 其中,路徑刷的中心色和路徑點色,預設都為背景色(白色)。 例如:(用路徑刷畫五角星) void FillPentacle(HDC hdc) { INT count = 10; Point points[] = {Point(100, 0), Point(122, 69), Point(195, 69), Point(137, 111), Point(159, 181), Point(100, 138), Point(41, 181), Point(63, 111), Point(5, 69), Point(78, 69)}; GraphicsPath path; path.AddPolygon(points, count); Graphics graph(hdc); PathGradientBrush pgBrush(path); pgBrush.SetCenterColor(Color::Red); //pgBrush.SetCenterColor(Color::Green); graph.FillPath(pgBrush, path); Color cols[] = {Color::Black, Color::Green, Color::Blue, Color::White, Color::Black, Color::Green, Color::Blue, Color::White, Color::Black, Color::Green}; /*Color cols[] = {Color::Cyan, Color::Aqua, Color::Blue, Color::Chartreuse, Color::Coral, Color::CadetBlue, Color::HotPink, Color::Turquoise, Color::LightSkyBlue, Color::DeepPink}; pgBrush.SetCenterColor(Color::White);*/ pgBrush.SetSurroundColors(cols, count); graph.TranslateTransform(200.0f, 0); graph.FillPath(pgBrush, path); for (int i = 0; i &< count; i++) cols[i] = Color(rand() % 255, rand() % 255, rand() % 255); pgBrush.SetSurroundColors(cols, count); pgBrush.SetCenterColor(Color(rand() % 255, rand() % 255, rand() % 255)); graph.TranslateTransform(- 200.0f, 200.0f); graph.FillPath(pgBrush, path); for (int i = 0; i &< count; i++) cols[i] = Color(rand() % 255, rand() % 255, rand() % 255); pgBrush.SetSurroundColors(cols, count);

pgBrush.SetCenterColor(Color(rand() % 255, rand() % 255, rand() % 255)); graph.TranslateTransform(200.0f, 0.0f); graph.FillPath(pgBrush, path); }


推薦閱讀:

那些著名的遊戲製作人的在遊戲製作過程中的職責是什麼?
遊戲的新手任務的作用是什麼,是否一定有必要?新手任務設計需要注意什麼?
討厭加班的人在加班公司如何生存?
手機遊戲開發團隊如何禁止玩家使用iap crack等破解內購的插件?
遊戲中的動態模糊是什麼概念?

TAG:遊戲開發 | 編程 | Unity遊戲引擎 |