雜物聚集地

UnityEngineAnalyzer測試記錄

Wed, 12 Jul 2017 02:16:55 GMT

今年不同場合的Unity研討會好像都有提到Unity腳本靜態分析的分享,所以心血來潮測試一下Unity Engine Analyzer。

  1. 官方說安裝可以透過NnGet Package Manager搜索來找到,但是就我的狀況直接找是找不到的。
    因為我的vs2015內建的是https://www.nuget.org/api/v2/curated-feeds/microsoftdotnet/ 這個source
    需要的話連到NuGet首頁可以看到下面有寫新的URL https://api.nuget.org/v3/index.json
    改用這個就可以找的到了。

  2. Unity專案裡面一般會有三個: 一般, Editor, plugins,然而測試的時候安裝好像不會全部都幫你加上analyzer, 只會在其中的一個加上(我找不到他的邏輯)。 要在其他專案中加入的話, 只需要自行增加analyzer, 選擇ProjectPath\packages\UnityEngineAnalyzer.1.0.0.0\analyzers\dotnet\cs\UnityEngineAnalyzer.dll 就會加入了。

  3. 目前提供9種檢查, 主要是不要使用一些耗效能的方法, 刪除空的方法, 避免使用coroutines這類的檢查, 有需要可以自己擴充。


Android無法安裝Apk的處理方式

Mon, 05 Jun 2017 06:27:27 GMT

問題描述:

同事手機一直無法安裝目前專案的APK, 也不能確定發生什麼事?

處置:

  1. 在手機直接安裝沒有任何錯誤訊息, 嘗試使用adb shell pm install的方式來安裝, 可以看到Failure [INSTALL_FAILED_CONTAINER_ERROR]錯誤。

  2. 經查詢處理方式:

link
要刪除特定檔案, 感覺要用戶這樣做應該會被客訴到死..

  1. 同事在安裝adb shell pm install時加上-f強制安裝在內部系統內存發現可以安裝成功, 將尋找方向移到ApplicationInstallLocation上。

經查詢有一些文章
link
link2
指出只要Player settings在Android項的Install Location改為Automatic即可, 測試後可行。


Unity Culling Group簡介

Sun, 04 Jun 2017 17:01:51 GMT

以下內容主要來自公司內部分享

Culling Group (Unity)

link
該API於Unity 5.1後版本出現
主要用於攝影機可見範圍判定
個人感覺算是容易使用
API中提供距離判定功能, 以長度為主
物件在出現與消失, 以及距離段變更會有通知

主要用他來決定一些特效是否要產出與播放以及當看不到時關閉某些效果
主要的考量點還是在能少算就少算

// 建立  
CullingGroup group = new CullingGroup();  

一開始的Group建立

// 設置攝影機  
group.targetCamera = Camera.main;  

設定攝影機, 攝影機可以之後再切換, 切換後會通知你物件的可見狀況

// 設定BoundingSphere  
BoundingSphere[] spheres = new BoundingSphere[1000];
spheres[0] = new BoundingSphere(Vector3.zero, 1f);
group.SetBoundingSpheres(spheres);
group.SetBoundingSphereCount(1);

這裡主要是設定BoundingSphere, 之後只要更新位置, 就可以收到Culling Group的通知, BoundingSphere的大小依照需要來調整
另外是BoundingSphere的個數因為要丟一個array進去, 個人感覺需要另外作管理, 一開始給一個大一點的array後來再去管理裡面的使用狀況

// 關閉
group.Dispose();
group = null;

要記得不用時一定要關閉他, 不做這個動作下一次可能運作會不正常, 且Unity會跳一個error來提示

// 區間帶設置
group.SetBoundingDistances(new float[] { 5000, 10000, 15000, 20000, 25000});
int DistanceBand = group.GetDistance(Idx);

這裡主要是設置區間帶, 在可視狀態變更時會一起給你區間帶的Index, 可以用來作一些處理
有一點要注意, 像我最後設置25000, 則多於這個距離的都會判定為不可視

// 狀態通知設置
group.onStateChanged = StateChangedMethod;

private void StateChangedMethod(CullingGroupEvent evt)
{
	if(evt.hasBecomeVisible)
		Debug.LogFormat("Sphere {0} has become visible!", evt.index);
	if(evt.hasBecomeInvisible)
		Debug.LogFormat("Sphere {0} has become invisible!", evt.index);
}

主要是通知你可視狀態的變更, 回傳Index, 再以Index來得到要處理的物件作處理, 所以紀錄Index與其對應的物件是必要的


DOTween:一個好用的Unity Tween System plugin

Thu, 25 May 2017 09:57:33 GMT

以下內容為之前在公司分享的東西

目前專案使用的Tween System

  • 美術:UITweener(來自NGUI)
  • 程式:視狀況使用DOTween或UITweener

為何要使用DOTween

  • 從Cocos2d-X轉到Unity, 突然少了Action很不方便
  • 我個人來看UITweener不太夠用

DOTween

https://dotween.demigiant.com/index.php
2016年10月左右開始使用

優點:

  • Open Source
  • 文件完整

缺點:

  • 功能限制(Pro版)
  • 沒有Component

Features

個人比較在乎的

  • Speed and efficiency

Not only very fast, but also very efficient: everything is cached and reused to avoid useless GC allocations.

  • Shortcuts

Shortcut extensions that directly extend common objects like this: // Move a transform to position 1,2,3 in 1 second transform.DOMove(new Vector3(1,2,3), 1);

  • Full control

Play, Pause, Rewind, Restart, Complete, Goto and tons of other useful methods to control your tweens.

其他見 https://dotween.demigiant.com/index.php#features

基本功能

Transform

  • DOMove
  • DOMoveX/DOMoveY/DOMoveZ
  • DORotate
  • DORotateQuaternion
  • DOLookAt
  • DOScale
  • DOScaleX/DOScaleY/DOScaleZ
  • DOShakePosition
  • DOShakeRotation
  • DOShakeScale
  • DOPath

Material

  • DOColor
  • DOFade
  • DOFloat
  • DOOffset
  • DOTiling

Camera

  • DOAspect
  • DOColor
  • DOFieldOfView
  • DONearClipPlane
  • DOOrthoSize

通用方法

// Tween a Vector3 called myVector to 3,4,8 in 1 second
DOTween.To(()=> myVector, x=> myVector = x, new Vector3(3,4,8), 1);

callbacks

幾乎可以應付所有狀況的callback可以使用

  • OnComplete
  • OnUpdate
  • OnKill
  • OnPlay
  • OnPause
  • OnRewind
  • OnStart
  • OnStepComplete: 這個比較特別, 如果有repeat的話每一次都會呼叫

options

這裡列出幾個比較常用的選項

  • SetEase(Ease easeType \ AnimationCurve animCurve \ EaseFunction customEase)

漸進的設置

  • SetId(object id)

設置一個獨特的id, 以便以後取用

  • SetLoops(int loops, LoopType loopType = LoopType.Restart)

播放次數

  • SetUpdate(UpdateType updateType, bool isIndependentUpdate = false)

設置該tween要在Update, FixedUpdate, LateUpdate處理

  • SetDelay(float delay)

延遲時間

  • SetSpeedBased(bool isSpeedBased = true)

以單位時間為基準, 打開後設置的時間會變成每單位的時間。
比方說DOMove(4, 1)原本是一秒移動4單位,會變成一秒移動一單位, 移動4秒。

效能

官方測試 https://dotween.demigiant.com/#enginesComparison

其他

個人喜歡他的DoPath會有預覽線條的功能。


一些shader相關網站

Sun, 24 Jan 2016 02:52:25 GMT

Formulas for Photoshop blending modes
講解一些Blend mode的公式 https://www.deepskycolors.com/archive/2010/04/21/formulas-for-Photoshop-blending-modes.html

Photoshop Blendmodi in GLSL
同上, 但是主要針對GLSL https://renderingpipeline.com/2012/06/photoshop-blendmodi-glsl/

ANDROID LESSON FIVE: AN INTRODUCTION TO BLENDING
講解OpenGL中的BlendFunc的計算公式 https://www.learnopengles.com/tag/additive-blending/

GLSL : common mistakes
常見的GLSL錯誤 https://www.opengl.org/wiki/GLSL_:_common_mistakes