朝着目標點旋轉(盯着目標點)Mathf.Atan2
這個意思就是返回弧度角的正切是y/x。
返回值是x軸與起始零點和終點2D向量(x,y)的之間夾角。
注意此函數,x爲0的情況,返回正確的角度,而不是拋出被零除的異常。
using UnityEngine;
public class RotateToTarget : MonoBehaviour
{
public Transform trans;
public Transform target;
void Update()
{
RotationToTarget(trans, target);
}
//轉向目標點
void RotationToTarget(Transform trans, Transform target)
{
Vector3 dir = trans.position - target.position;
float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
trans.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
}
}
字符串轉Enum
string value = defaultValue;
KeyCode code = (KeyCode)Enum.Parse(typeof(KeyCode),value);
Awake 和 Start 的執行時機
Awake函數是不管腳本是否啓用,只要掛載的遊戲物體顯示就調用,
Start函數只有在腳本設置爲可用並且遊戲物體顯示的情況下才會調用
當使用Application.OpenURL(m_BunleTargetPath+"/");打開文件時,末尾一定要加路徑分隔符才能打開
private static string m_BunleTargetPath = Application.dataPath+"/../AssetBundle/" + EditorUserBuildSettings.activeBuildTarget.ToString();
UnityEngine.Events.UnityEvent
定義unity事件UnityEngine.Events.UnityEvent可以使定義的事件像可序列化的屬性一樣暴露在檢視面板,通過拖拽給這個事件添加響應事件,類型UGUI裏面的Button添加點擊事件一樣,如果擴展UnityEngine.Events.UnityEvent事件,則擴展類需要添加[Serializable]特性纔可以讓其定義的事件暴露在Inspector面板上,如果擴展的事件爲泛型類,則不會顯示在在Inspector面板上:
public UnityEngine.Events.UnityEvent TestEvent0;
[Serializable]
public class MyUnityEvent : UnityEngine.Events.UnityEvent { }
public MyUnityEvent myUnityEvent;
[Serializable]
public class MyEventTest1 : UnityEvent<int, int, string> { } //Inspector面板可見
//泛型參數事件,Inspector面板不可見
public class MyEventTest<T0, T1> : UnityEvent<T0, T1> { }
//int+int ;區別於上面情況,這個不能在面板繪製,所以必須new對象,否則對象爲空異常。
public MyEventTest<int, int> m_TimeEvent0 = new MyEventTest<int, int>();
訂閱事件:TestEvent0.AddListener(() => DoAction("參數來自於腳本添加"));
響應,觸發事件:TestEvent0.Invoke();
協程
當禁用MonoBehaviour時,協程不會停止,只有MonoBehavirour被銷燬,或主動停止協程時,協同纔會停止。使用MonoBehaviour.StopCoroutine和MonoBehaviour.StopAllCoroutines來停止協同。
OnApplicationQuit()
攔截應用程序退出在 應用程序退出響應函數裏面:
void OnApplicationQuit()
{
Application.CancelQuit();//退出攔截
MessageCtrl.Instance.OpenConfirmView("關閉界面將終止課程進程,確認關閉?", "", () =>
{
Application.Quit();
});
}
程序根目錄路徑:Application.dataPath + "/../config.ini"; //Application.dataPath Editor模式是Assets目錄路徑,打包後是*_Data目錄路徑
1.如何查看某個層(layer)有哪些物體:
點擊右上角的Layers按鈕,通過關閉或者打開眼睛可隱藏或顯示設置爲某個Layer的所有物體
腳本特性:
void OnValidate()//在Inspector中修改參數值,就會自動調用這個方法
[ExecuteInEditMode]//添加這個以後,Start方法會在添加腳本和點擊run或stop的時候執行一遍
[AddComponentMenu("MyTool/MaterialOrder")] //腳本可以在添加腳本面板添加
#if UNITY_EDITOR
using UnityEditor;//自動調用OnValidate()方法
#endif
using UnityEngine;
[ExecuteInEditMode]//添加這個以後,Start方法會在添加腳本和點擊run或stop的時候執行一遍
[AddComponentMenu("MyTool/MaterialOrder")]
public class MaterialOrder : MonoBehaviour {
[Range(3000,3300)]
public int renderLayer = 3000;
void Start()
{
ChangeQueue(renderLayer);
}
#if UNITY_EDITOR
void OnValidate()//在Inspector中修改參數值,就會自動調用這個方法
{
ChangeQueue(renderLayer);
}
#endif
void ChangeQueue(int layer)
{
if (layer >= 3300) layer = 3300;
gameObject.GetComponent<Renderer>().sharedMaterial.renderQueue = layer;
}
}
LayerMask
LayerMask實際上是一個位碼操作,在Unity3D中一共有32個Layer層,並且不可增加。
位運算符
按位運算符:~、|、&、^
。位運算符主要用來對二進制位進行操作。
邏輯運算符:&&、||、!。
邏輯運算符把語句連接成更復雜的複雜語句。
按位運算符:左移運算符<<
,左移表示乘以2,左移多少位表示乘以2的幾次冪。
LayerMask mask = 1 << 2; 表示開啓Layer2。
LayerMask mask = 0 << 5;表示關閉Layer5。
LayerMask mask = 1<<2|1<<8;表示開啓Layer2和Layer8。
LayerMask mask = 0<<3|0<<7;表示關閉Layer3和Layer7。
上面也可以寫成:
LayerMask mask = ~(1<<3|1<<7);表示關閉Layer3和Layer7。
LayerMask mask = 1<<2|0<<4;表示開啓Layer2並且同時關閉Layer4.
public class example : MonoBehaviour {
LayerMask mask = ~(1<<3|1<<7);
void Update() {
if (Physics.Raycast(transform.position, transform.forward, 100, mask.value))
Debug.Log("Hit something");
}
}
2.運行模式下可動態設置 physicsManager 下的Layer Collision Matrix : 在這裏可以設置物體 分層碰撞
3.關閉日誌輸出:Debug.logger.logEnabled=false; 爲輸出日誌添加回調函數:Application.logMessageReceived+=LogMessageReceivedFunc;使用 ILoggerHandle的子類講Debug.Log的默認輸出替換成可控的函數。
4.快捷高效替換UI,在編輯器外面替換掉原有UI,名字保持不變,不要刪除 .meta文件,可實現替換掉所有引用到此圖片的UI貼圖
5. [SerializeField]表示將原本不會被序列化的私有變量和保護變量變成可以被序列化的,那麼它們在下次讀取的值就是你上次賦值的值。[HideInInspector]表示將原本顯示在面板上的序列化值隱藏起來。凡是顯示在Inspector 中的屬性都同時具有Serialize功能(序列化的意思是說再次讀取Unity時序列化的變量是有值的,不需要你再次去賦值,因爲它已經被保存下來)。
Serializable是.Net自帶的序列化
有時候我們會自定義一些單獨的class/struct, 由於這些類並沒有從 MonoBehavior 派生所以默認並不被Unity3D識別爲可以Serialize的結構。自然也就不會在Inspector中顯示。我們可以通過添加 [System.Serializable]這個Attribute使Unity3D檢測並註冊這些類爲可Serialize的類型。具體做法如下:
[System.Serializable]
public class FooBar {
public int foo = 5;
public int bar = 10;
}
注意:Serializable只可以對class,struct,enum,delegate進行序列化,不可以對屬性序列化
冷門:
把某個shader總是添加到預定義shaders數組裏面: 在 Edit-->Project Settings-->Graphics-->Always Included Shaders 的數組裏面添加,這樣做的好處是不需要把這個shader加載動態加載進來就可以使用這個shader,加載assetbundle時能感受到這樣設置帶來的好處
編輯器模式下運行:
在monobehavior腳本文件頭添加[ExecuteInEditMode]標籤就可以在編輯器模式下運行代碼