天天看點

Unity3D小功能 小技巧 小教程 小原理(持續更新...)

Unity3D小功能 小技巧 小教程 小原理(持續更新...)

1.Unity的.NET版本是2.0

按道理來說,C#能用的功能Unity也能用,但是Unity的.NET卻不是最新版

要是用一些别的DLL或者接入SDK的時候有DLL,就會發現有一些DLL的.NET版本是4.0,Unity便無法使用這些DLL,相當困擾。

2.關閉Request error提示 Edit→Preferences→General→Show Asset Store search hits

3.設定物體實體互不碰撞

Edit-Project Settings-Physics 打開實體管理器(Physics Manager)

裡面可以設定層級互相間的碰撞

4.進度條

通過改變UI的FillAmount值

public UnityEngine.UI.Image healthBar;

void Start() {healthBar.fillAmount = 0.0f;}

5.Unity連接配接多媒體SDK開發

體感:Kinect、Leapmotion

AR:Vuforia Metiao EasyAR VoidAR

VR:gear 暴風 oculus HTC

觸屏: Input.Touch EasyTouch(插件)

7.Inspector面闆修改

例如添加一個按鈕:

[CustomEditor(typeof(出現按鈕的腳本名)), CanEditMultipleObjects]

public class 自定腳本名: Editor {

public override void OnInspectorGUI(){

base.OnInspectorGUI();//繪制原本的資訊//

if(GUILayout.Button("自定義按鈕名字")){

方法函數();

}

}}

8.平台預處理

#if UNITY_EDITOR

platform = "hi,大家好,我是在unity編輯模式下";

#elif UNITY_XBOX360

platform="hi,大家好,我在XBOX360平台";

#elif UNITY_IPHONE

platform="hi,大家好,我是IPHONE平台";

#elif UNITY_ANDROID

platform="hi,大家好,我是ANDROID平台";

#elif UNITY_STANDALONE_OSX

platform="hi,大家好,我是OSX平台";

#elif UNITY_STANDALONE_WIN

platform="hi,大家好,我是Windows平台";

#endif

Debug.Log("Current Platform:" + platform);

9.加載Resources

GameObject instance = Resources.Load("資源名字") as GameObject;

GameObject cube = Instantiate(instance) as GameObject;

cube.transform.position = this.transform.position;

10.Only one exe隻允許打開一個程式

int count=Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length ;

if (count> 1)

{// MessageBox.Show(count.ToString());調試使用

//殺掉目前

Process.GetCurrentProcess().Kill();}

11.物體de 旋轉 and 位移

旋轉:

(瞬間)transform.localRotation = Quaternion.Euler(new Vector3(x,y,z));

(緩慢)transform.rotation = Quaternion.Slerp( a , b , t );

位移

(速度相關) transform.position=Vector3.MoveTowards(transform.position,tempUpdatePos,Time.deltaTimeDisShakeThreshold);

(固定時間)this.transform.Translate(Vector3.normalize(目标位置-自身位置) (Vector3.Distance(自身位置, 目标位置)/(所用時間 * Time.deltime)));

2d 向某方向移動

moveDirection = mTarget.transform.position - mSelf.transform.position;

moveDirection.Normalize();

float target = Mathf.Atan2(moveDirection.y, moveDirection.x) Mathf.Rad2Deg - 90f;

mSelf.transform.rotation = Quaternion.Slerp(mSelf.transform.rotation, Quaternion.Euler(0, 0, target), turnSpeed Time.deltaTime);

_controller.SetForce(speedX,speedY));

6.改變滑鼠位置和隐藏滑鼠

using System.Runtime.InteropServices;

[DllImport("user32.dll")]

public static extern int SetCursorPos(int x, int y);

Void XX(){ SetCursorPos(0, 0); }

void Start () {

//隐藏

Cursor.visible = false;

17.控制全局音量

通過 AudioListener.volume = *;來控制場景場景音量

18.UGUI

對于Text 使用材質和Outline可以制作出藝術字型

Mask可以遮掩 對于制作一些動畫比較好

19.滑鼠點選設定UI位置(不同分辨率設定有不同 此處執行個體為1920*1080 可在調試模式下使用)

GetComponent<Animator>().SetTrigger("Clip");

// 擷取目标對象目前的世界坐标系位置,并将其轉換為螢幕坐标系的點

Vector3 Pos = Camera.main.WorldToScreenPoint(transform.position);

// 設定滑鼠的螢幕坐标向量,用上面獲得的Pos的z軸資料作為滑鼠的z軸資料,使滑鼠坐标與目标對象坐标處于同一層面上

Vector3 mousePos = new Vector3(Input.mousePosition.x(1920.0f/(float)Screen.width) - 1920/2, Input.mousePosition.y(1080f/(float)Screen.height) - 1080/2,Pos.z);//先乘一個GameView折扣(GameView要設定為1920*1080) 然後減去中心點的內插補點

Debug.Log(mousePos.ToString());

transform.position = mousePos;

20.使用AssetsBundle壓縮檔案有奇效

首先制作一個空項目,加入AB代碼後,導出有28M

然後我是使用了一組72幀的動畫,這組動畫大約有4M

衆所周知,unity對2D Sprite格式處理會使圖檔很大,由原本的圖檔大小67k變到了Unity裡的1m一張

然後我把動畫加到了UGUI裡 然後導出,震驚的94M總共

最後使用AB壓縮,觀察壓縮的檔案,最大的image裡就2M

比原圖還要小

導出結果當然也小

AB真是太好用了 建議獨立物件都用AB

21.重置動畫(播放動畫第一幀)

firstAnimName = GetComponent<Animator>().GetCurrentAnimatorClipInfo(0)[0].clip.name;

GetComponent<Animator>().Play (firstAnimName,-1,0);

22.Mono中文亂碼

【Tools】-->【Option】, 然後選擇【Fonts】,輕按兩下【Text Editor】,選擇【Monospace】字型 Normal 10

23.uLua使用方法

注意AppConst裡的LuaBundleModel變量,如果想使用AssetBundle模式,該值置為true,但是每次修改lua代碼,需要執行菜單欄上的LuaFramework->Build XXX Resource,将lua資源打包,否則,你修改的lua邏輯不會更新并執行。

如果LuaBundleModel置為false,則lua代碼會時時更新。

此外,修改C#代碼,一定不要忘了執行菜單Lua->Clear wrap files,然後重新生成Gen Wrap + Binder

确定邏輯無誤後,注冊C#類,打開"CustomSettings.cs",注冊我們的類。"_GT(typeof(XXXXXX)),"。最後,執行上面第2步的Lua->Clear wrap files,Gen Wrap + Binder。此時,會生成一個叫MyHelloWorldWrap.cs的檔案,在Assets\LuaFramework\ToLua\Source\Generate目錄下,其實所有在CustomSettings中注冊的C#類都會生成Wrap檔案,儲存在該目錄下。

24.使用VS作為C#編輯器

vs可以斷點調試和為Unity提供的便捷簡直不要太好

下載下傳VS Tool for unity即可斷點調試 (選擇相應VS版本) 位址:https://marketplace.visualstudio.com/items?itemName=SebastienLebreton.VisualStudio2015ToolsforUnity

但是vs的快捷鍵蛋疼得很,--修改快捷鍵ctrl+w關閉目前視窗的方法:http://www.cnblogs.com/ayanmw/p/3161286.html

編譯器相關 如果使用Vs的 #region 和 #endregion 用于代碼的隐藏縮放,對于項目代碼管理,相當好用。Mono也有縮放模式,有點礙眼..

Process.Start()

一個C#的API 可以用于打開一個網頁..應用..或者程序..或者控制台内的功能..例如列印..

public void PrintFile(){

System.Diagnostics.Process process = new System.Diagnostics.Process(); //系統程序

process.StartInfo.CreateNoWindow = false; //不顯示調用程式視窗

process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;//

process.StartInfo.UseShellExecute = true; //采用作業系統自動識别模式

process.StartInfo.FileName=path; //要列印的檔案路徑

process.StartInfo.Verb="print"; //指定執行的動作,列印:print打開:open…………

process.Start(); //開始列印}

5.Unity加載圖檔動畫(動畫比較多的情況)

(1.UnityAnimation播放,直接全選png序列幀圖(卡超級久) 然後拖到面闆上(卡很久),會自動生成序列播放的animator。但我發現超過300圖之後有可能會出現不明報錯(大概因為輸出問題),1k張感覺就沒什麼希望了,最重要的是在unity裡1080p的圖轉成sprite,都會變成10m一張,導緻項目釋出之後更是奇大無比。

(2.播放mov,可以嘗試播帶透明通道的mov,但需要一個shader,具體我不會寫,在網上找到的也不太好用,各種問題(摳色會失真和有噪點,提取透明or黑白遮罩會出現不同步)。

(3.Load的方法,unity有3種。(需要在start前預先加載完,不要一邊播一邊加載會卡的。)

① LoadPrefab,不考慮。

②LoadResources,先load資源檔案夾内的,然後播放。目前測試超過700張Unity會迷之不加載,估計是load的東西太大。

③LoadAssets。因為是一張張地load,不會出現太大而不加載的問題。目前使用這個辦法播放

④AB加載

25.遠端Mac雞可以使用vnc viewer連接配接 ,Cornerstone作為項目管理

26.求向量夾角

向量 = 目标位置 - 共同起點位置

v3.angle(向量A,向量B)