1、Event Function:事件函數
- Reset() :被附加腳本時、在游戲物體的組件上按Reset時會觸發該事件函數
- Start() :在游戲初始化時會執行一次
- Update() :每一幀都會運行這個方法
- FixedUpdate(): 會在指定幀調用該方法多少次
- LateUpdate(): 晚於Update的運行順序,但是FPS和Update是一樣的
- Awake() Start() : 都是在游戲物體初始化運行一次,但是Awake的運行順序高於Start的,並且只要腳本中存在Awake方法,則無論是否掛載了該腳本都會執行該方法
- OnEnable(): 當將物體的SetActive設置為true時就會自動調用調用該方法
- OnDestory(): 當關閉游戲則會調用該方法
2、Time時間類函數:
- Time.time 表示從游戲開發到現在的時間,會隨着游戲的暫停而停止計算。
- Time.timeSinceLevelLoad 表示從當前Scene開始到目前為止的時間,也會隨着暫停操作而停止。
- Time.deltaTime 表示從上一幀到當前幀時間,以秒為單位。【一般用來控制角色、動畫的運動】
- Time.fixedTime 表示以秒計游戲開始的時間,固定時間以定期間隔更新(相當於fixedDeltaTime)直到達到time屬性。
- Time.fixedDeltaTime 表示以秒計間隔,在物理和其他固定幀率進行更新,在Edit->ProjectSettings->Time的Fixed Timestep可以自行設置。
- Time.SmoothDeltaTime 表示一個平穩的deltaTime,根據前 N幀的時間加權平均的值。
- Time.timeScale 時間縮放,默認值為1,若設置<1,表示時間減慢,若設置>1,表示時間加快,可以用來加速和減速游戲,回放等、非常有用。如果游戲中控制運動的都是使用了Time.deltatime的話,則可以通過設置Time.timeScale=0來暫停其運動等。
- Time.frameCount 總幀數
- Time.realtimeSinceStartup 表示自游戲開始后的總時間,即使暫停也會不斷的增加。【一般用作性能測試】
- Time.captureFramerate 表示設置每秒的幀率,然后不考慮真實時間。
- Time.unscaledDeltaTime 以秒計算,完成最后一幀的時間 不考慮timescale時候與deltaTime相同,若timescale被設置,則無效。
- Time.unscaledTime 從游戲開始到現在所用的時間 不考慮timescale時候與time相同,若timescale被設置,則無效。
3、GameObject類:
【1】、創建游戲物體的三種方法:
- 通過其構造器來創建 GameObject go=new GameObejct("游戲物體名"); //一般是用來創建空的游戲來存放其他東西的。
- Instantiate GameObject.Instantiate(prefab) //根據Prefab或者是另外一個游戲物體來創建(克隆Colon),可以實例粒子、等其他的游戲物體,很是常用的
- CreattePrimitive GameObject.CreatePrimitive(PrimitiveType.**) //創建原始的游戲物體,基本的幾何體
【2】、 為游戲物體添加組件, 其中組件可以是我們自己自定義的腳本GameObject.AddComponent<組件名>
【3】、屬性、變量:
- GameObject.activeInHierarchy 游戲物體是否處於激活狀態,與父類有關,父類被取消激活,則子類也是取消激活的
- GameObject.activeSelf 自身的激活狀態,與父類無關,只與自身有關。【控制組件的激活與取消激活則使用.enable=false/true】
- GameObject.tag 游戲物體的tag標簽,具體的由程序員自定義設置
- GameObject.SetActive(false/true) 通過參數的控制來設置其游戲物體的激活狀態,true為激活狀態,反之為取消激活狀態。
【4】、UnityEngine.Object中的共有方法與變量
- name: 名字,調用該變量,則無論是通過GameObject還是Component都是返回游戲物體的名字
- Destroy() :刪除游戲物體,但是不會立馬在unity中刪除,而是會先進行回收,等確定沒對象使用的時候,在進行刪除
- DontDestroyOnLoad() : 當加載新的場景的時候,不刪除這個場景中的某個游戲物體
- FindObjectType<>
- FindObjectsType<> : t通過類型來進行查找,是進行全局的查找,則就是在整個場景中進行查找
- FindGameObjectWithTag :如果查到的是多個,則只返回查找到的第一個
- FindGameObejctsWithTag 返回查找到的游戲物體集合
【5】、消息的發送
- BroadcastMessage() 廣播發送消息,則該物體上對應的方法會被調用,同時這個游戲物體上的子物體上對應的方法也會被調用的
- SendMessage() 發送消息,只會對這個游戲物體中腳本上的方法發送消息
- SendMessageUpwards() 廣播發送消息,但是和BroadcastMessage()是相反的,在調用自身的方法時也會向上傳遞,調用其父類的方法
【6】、游戲組件的查找
- Cube cube = target.GetComponent<Cube>(); 返回一個對應的組件,如果有多個,則只返回第一個
- Cube[]cc= target.GetComponents<Cube>(); 返回該游戲物體上所有符合條件的組件,返回一個組件數組
- Cube[] xx = target.GetComponentsInChildren<Cube>(); 返回該游戲物體上的對應組件,同時返回該游戲物體的子類上對應的組件
- Cube[] yy = target.GetComponentsInParent<Cube>(); 返回該游戲物體上的對應組件,同時返回該游戲物體的父類上對應的組件
4、MonoBehaviours的類:
【1】、繼承的變量成員
- enabled: 返回該組件是否被激活或者是被禁用,可以通過該變量來進行設置
- isActiveAndEnabled: 只能返回該組件是否激活的標志位,不能設置該變量,為只讀的
- tag :該組件所對應的游戲物體的標簽
- name :該組件所對應的游戲物體的名字
【2】、Invoke等方法、變量:將添加要調用的方法添加到等待隊列中,然后等待用戶設定的時間后,進行隊列中的方法調用。
- Invoke("方法1",float time): 在等待time的時間后調用方法1
- bool i= IsInvoking("方法1") 返回bool值,如果方法被添加到隊列中,但沒有被運行則返回true,如果經過一段時間后該方法被調用了則會返回false;
- InvokeRepeating("方法1",time,number): 等待time時間后,會重復開始運行方法1,每秒鍾運行number次。
- CancelInvoke() 會暫停通過Involve/InvokeRepeating的運行,但是一般來說CancelInvoke會和InvokeRepeating組合調用。參數由自己設定
擴充: 在腳本的類前添加[ExecuteInEditMode]:則該腳本不用按游戲運行按鈕就會開始編譯,只限在編輯模式里面
在腳本的共有變量前添加[HideInInspector]:則該共有變量不會在Inspector面板進行顯示
5、Coroutines:協程:
1、定義協程:IEnumerator 方法名()
{
yield return 0/null ;
yield return new WaitForSeconds(1.0f); //等待一定時間在運行下面的代碼
}
2、開啟協程:StartCoroutines(方法名());
說明:協程開啟會繼續執行下面代碼,不會等協程方法運行完再執行接下來的方法
3、開啟與關閉協程時,StartCoriutine(參數)、StopCoroutine(參數) 其中的參數要互相對應,如果傳遞的是方法名,則兩個方法中的參數就要是方法名,如果是IEnumerator的返回值,則其中兩個方法發的參數就要是IEnumerator的返回值
1、 private IEnumerator coroutine;
coroutine = WaitAndPrint();
StartCoroutine(coroutine);
StopCoroutine(coroutine);
2、StartCoroutine("WaitAndPrint");
StopCoroutine("WaitAndPrint");
4、StopAllCoroutines() 停止所有的協程,不管你是怎么調用的
6、OnMousexx鼠標觸發事件: 如果是通過Collider進行觸發檢測的話,則要在設置中打開允許進行射線檢測。
- OnMouseDown(): 當鼠標按下的時候觸發,按一次觸發一次
- OnMouseDrag(): 當鼠標按住不放的時候一直觸發,是每一幀進行觸發
- OnMouseUp(): 當鼠標抬起的時候觸發,只執行一次
- OnMouseEnter(): 當鼠標進入的時候觸發,進入一次觸發一次
- OnMousetOver(): 當鼠標在觸發物體的上面時,則一直觸發
- OnMouseExit(): 當鼠標移出的時候觸發
- OnMouseUpAsButton() 相當於是按鈕的功能,當鼠標在同一個游戲物體上按下抬起的時候才會觸發,按下與抬起不在同一個游戲上的話則不會進行觸發。
7、Mathf類:所有的成員均為靜態的
Mathf.Abs() 返回絕對值的
Mathf.Ceil() 向上取整的,10.1--->11
Mathf.Clamp(value,min,max) 如果value的值在min--max之間的話就返回value,但是如果value的值小於min,則返回min,如果value的值大於max,則返回max,一般是用在控制角色血量,當玩家的血量減少的時候,不會出現出現低於0和大於100的情況 hp= Mathf.Clamp(hp,0,100);
Mathf.ClosePowerOfTwo(value): 取得離value的2次方最近的值
Mathg.DeltaAngke: 取得兩個角度之間的最小夾角
Mathf.Floor 向下取整
Mathf.Pow(i,j) 取得i的j次方
Mathf.MoveToWards() 一般用來做移動控制,是勻速的運動,加速度固定的
Mathf.Lerp() 差值運算,一般是用來控制動畫、運動,越往后運行的越慢的。
Mathf.PingPong(t,maxValue) 類似乒乓球的來回運動,起始 值是0,通過t變量來控制值由0向maxValue移動,當t大於maxValue的時候又向0進行移動,然后就這樣的來回往復運動,一般t變量用時間Time.deltatime來進行控制的。
8、Input輸入類:
GetKey() 按鍵一直按着時觸發
GetKeyDown 按鍵被按下那一刻進行觸發
GetKeyUp 按鍵被按下后抬起時觸發
GetMouseButton(0/1/2) 1:左鍵 2:右鍵 3:中鍵 鼠標一直按着時觸發
GetMouseButtonDown() 鼠標按下那一刻觸發、
GetMouseButtonUp() 鼠標抬起的那一刻時觸發
GetButtonDown()
GetButton()
GetButtonUp() 這三個的參數是用戶自定義的虛擬按鍵進行觸發,其他的和上面的一樣
GetAxis("虛擬軸名") 通過按下的虛擬軸來返回-1~1之間的值,開始值是0,然后向-1/1進行漸漸的變化,有一定的加速度。一般用來控制運動的,比如是賽車的加速運動等
GetAxisRaw() 其他的和GetAxis差不多,就是少了漸變效果,返回值只有 0 1 -1三個
anyKeyDown 當任何按鍵被按下(包括鼠標按鍵)時返回true
anyKey 當任何按鍵被按着(包括鼠標)時返回true
mousePosition 返回鼠標在屏幕上的像素坐標,【屏幕坐標】z軸衡為0的
9、Vector2;二維向量
magnitude: 返回向量的長度
normalized; 返回這個向量長度為1的矢量,不管這個向量多長,也是返回1的矢量,只是返回值,不對原向量的值產生影響
Normalize() 無參數的,也是向量化,但是調用該方法會改變原向量值,使其的值被向量化 了
ClampMagnitude() ;將一個向量限制在參數中指定的長度之間
MoveToWards() 用來做勻速的運動,由一個位置向另一個位置進行移動
sqrMagnitude 對求向量的的長度時不進行開平方根運算了,減少性能的損耗,一般是用來比較兩個向量的長度大小的。
其他的參考API文檔即可,較為簡單。
擴充:向量是結構體,為值類型,修改其中的變量的時候要整體進行修改,不能單獨的進行單個變量的賦值修改
10、Vector3:三維變量
Cross() 插乘運算【左手法則】,通過兩個向量來獲得另一個向量的方向,然后進行相關的判斷
Project() 投影運算
Reflect() 反射運算
Slerp() 按照角度進行插值,與lerp的按照位置信息進行插值的,一般用在炮台的旋轉,使旋轉的更加平滑
11、Random隨機數類:
InitState(): 通過參數指定的種子,然后再調用Range()產生隨機數的時候會依據種子來進行生成,則每一次運行所生成的隨機數都是一樣的,是偽隨機數。一般要生成的隨機數不同,可以設置參數為System.DataTime.Now.Ticks:通過時間戳來完成
insideUnitFCircle :在單位為1的園內隨機生成一個位置信息,如果要在更大的圓中生成,則可以在后面*圓的半徑信息。一般用來控制隨機生成敵人的位置信息
insideUnitSphere: 在單位為1的球內隨機生成一個位置信息,如果要在更大的球中生成,則可以在后面*圓的半徑信息。
12、四元數 Quaternion:
歐拉角【eylarAngles】與面板中的值對應和四元數【rotation】之間是可以進行轉換的,一般歐拉角是用來讓用戶可以直觀的看到的,而四元數是用來控制內部的運算 的。
.eulerAngles 將四元數轉變為歐拉角
Euler() 將歐拉角轉變為四元數
.LookRotation() 讓玩家通過設置四元數來進行望向敵人的旋轉,將向量方向轉變為四元數
Vector3 temp = enemy.position - player.position; //獲得兩個位置信息之間的變量,是主角望向敵人,所以要設置向量的方向是指向敵人的
enemp.y = 0; //如果不想主角在望向他的時候出現低頭的情況,也就是y軸的值出現了變化了。
player.rotation= Quaternion.LookRotation(temp);
slerp() 在做朝向的旋轉的時候,不建議使用lerp,而是建議使用slerp,使其的旋轉朝向更為平滑,更加的自然
Quaternion target= Quaternion.LookRotation(temp);
player.rotation = Quaternion.Slerp(player.rotation, target, Time.deltaTime); //插值的緩慢旋轉
13、Rigidbody:剛體組件,控制角色的移動
.position: 可以通過剛體來控制運動,在控制運動方面,使用rigibody.positon比transform.porition計算要快的多,相關的物理計算也是在剛體中計算好了,但是不建議使用這個方法來持續的控制物體的運動,不平滑,控制一兩次的時候還可以使用
MovePosition() 對position的優化,其中利用了插值運算,一般持續運動的則使用這個方法,不出現卡頓的現象
,rotation:
MoveRotation 用來控制剛體的旋轉的,一般不建議使用rotation,比較耗性能,建議使用MoveRotation(),然后配合Quaternion,slerp()進行使用,使其更加的平滑
AddForce() 為剛體添加力,一般可以用在賽車游戲中,當進行短時的加速則可以給以限定時間的AddForce方法
14、Camera;相機組件:
當相機的標簽是main cream時,可以通過Camer.main來進行主相機cream組件的查找射線,用來檢測鼠標在屏幕上的位置信息,以及觸碰到什么
Ray ray = cameraMain.ScreenPointToRay(Input.mousePosition); //獲得相機到鼠標之間的射線
RaycastHit hit; //用來存放射線檢測到的游戲物體的信息的
bool temp = Physics.Raycast(ray, out hit); //進行射線檢測
15、Application
SreeamingAcsets: 該文件下的資源不會被壓縮,導入是什么類型還是什么類型,【主要是音頻、視頻資源】
dataPath: 工程文件路徑
streamingAssetsPath: 可以通過文件流來進行讀取的文件路徑
persistenDataPath :可以實例的文件路徑
tempporaryCachePath :臨時的文件路徑
Application.OpenURL("") 打開指定的網址
Application.Quit() 退出游戲的運行
.CapturScreenshot("游戲截圖") 用來截圖的,字符串為截圖fileName
Application.identifier 標識名
.companyName 公司名
productName 產品名
instalMode 安裝包名
isEditor 是否在編輯器模式
isFocused 是否在焦點
isMoliePlatform 是否是移動平台
isPlaying
isWebPlayer
platform 編輯器的平台
unityVersion unity版本號
version 項目文件版本號
runInBackground 是否可以在后台運行
UnityEditor.EditorApplication.isPlaying=false; //在編輯器模式下推出編輯狀態
16、SceneManager場景類
SceneManager.LoadScene() 加載下一個場景,一般是用在另一個場景不是太大的情況下
SceneManager.LoadSceneAsync() 異步加載下一個場景,返回AsyncOperation類型,里面包含了加載的信息,加載的進度條等等。可以讓用戶緩解等待加載場景的時間
sceneCount 獲得當前加載的場景個數
sceneCountInBuildSettings 在Build面板中加載的場景個數
GetActiveScene() 獲取已經加載的當前場景的信息
GetSceneAt(index) 加載index索引的場景
當加載新的場景的時候會觸發下面的事件:
activeSceneChanged 當有新場景被加載的時候就會調用這個事件
sceneLoaded 當有新場景加載完成的時候就會觸發這個事件
擴充:事件的注冊時通過加方法來進行注冊的:
SceneManger.activeSceneChanged+=OnAcitiveScenenChanged;
17、射線檢測:一般射線檢測要在射線檢測的范圍內,並且被檢測物體要有Collider
Ray ray=new Ray(起點,方向);
PaycastHit hit; //hit中存放的是射線檢測的碰撞信息
bool temp=Physics.Raycast(ray,out hit); //具體的重載方法邊用邊查
Ray ray = new Ray(this.transform.position + transform.forward, transform.forward); //創建射線
RaycastHit hit; //存儲射線檢測到的游戲物體信息
if(Physics.Raycast(ray,out hit)) //通過返回值來判斷射線是否檢測到相關的物體了
{
Debug.Log(hit.collider.gameObject.name);
}
擴充:
Raycast;檢測的是射線碰撞到的第一個物體,不具有穿透性
RaycastAll:返回的是RaycastHit數組,具有穿透性,可以返回檢測到的多個游戲物體
18、代碼監聽觸發事件:
<Button>().onClick.AddListener(方法名); //當觸發button組件,則會觸發指定的方法名的方法
通過實現接口來注冊監聽事件: using UnityEgine.EventSystems; 導入命名空間
IPointerDownHandler 鼠標按下的事件,具體的接口參考手冊
Raycast Target: 如果取消勾選則不做事件監聽了,則無法實現檢測了
19、www類,下載 是用來在網絡中下載資源的,
public string url = "http://img.taopic.com/uploads/allimg/120727/201995-120HG1030762.jpg";
IEnumerator Start()
{
WWW www = new WWW(url);
yield return www;
Renderer renderer = this.GetComponent<Renderer>();
renderer.material.mainTexture = www.texture;
}
20、Touches觸摸事件:
Input.touches: 返回放在屏幕上的手指信息,返回數組
Touch touch1=Input.touches[0];
touch1.position;
TouchPhase pahse=touch1.phase phase 是用來返回手指的狀態的
21、Debug.DrawRay(ray.oridin,ray.direction) 繪制射線,第一個參數是原點,第二個是方向
22、CharacterController角色控制器
.SimpleMove(【vector3】) 簡單移動
.isGrounded 判斷是否到地面上,bool值
.Move() 與simpleMove的區別是要*Time.deltatime、而且simpleMove會使用自帶的重力
OnCOntrollerColliderHit(ControllerCollidrHit hit) 當有碰撞到其他的碰撞器的時候會觸發這個事件函數【hit保存碰撞到的物體信息】
23、Mesh的設置:
material mesh指定人是什么樣子的,material指定人的膚色是什么樣子的
24、API變更:
棄用:Application.LoadLevel();
新的:SceneManager.LoadScene(); 加載新的場景
棄用
新的:Scene scene=SceneManager.GetActiveScene(); //獲得當前活動場景的信息
SceneManger.LoadScene(scene.buildIndex) //重新加載當前場景
OnLevelWasLoaded() 當場景被加載的時候調用,被棄用了
改成事件了:sceenLoaded