Name
object.Destroy(建議用這個(gè)病附,不會(huì)被立刻回收冤今,放在垃圾池里棺棵,再同意銷毀)
Object.DestroyImmediate(立刻銷毀谒撼,可能會(huì)導(dǎo)致控制幀)
destroy(**,5)食寡,可以設(shè)定銷毀時(shí)間
DontDestroyOnLoad, 在場(chǎng)景切換的時(shí)候廓潜,這個(gè)游戲物體抵皱,始終存在(可以用來設(shè)置共享物體)
FindObjectOfType
根據(jù)組件類型,查找組件辩蛋,在全局里進(jìn)行搜索呻畸,只找第一個(gè)就返回,不會(huì)去找多個(gè)
- FindObjectsOfType
可以查找場(chǎng)景里所有的組件悼院,然后返回?cái)?shù)組伤为,不查找未激活組件 - 以上都是靜態(tài)方法
- 靜態(tài)方法就是通過類名來調(diào)用
Gameobject.Find(性能耗費(fèi)特別高,不要用在update里)
Gameobject.FindGameObjectsWithTag(查找所有有這個(gè)標(biāo)簽的物體据途,性能耗費(fèi)低一些)
Gameobject.FindWithTag(查找第一個(gè)有這個(gè)標(biāo)簽的物體绞愚,性能耗費(fèi)低一些)
- gameobject和component的禁用方法不一樣,
gameobject, 用SetActive(false)
component颖医,用enabled. - unityexception(沒有設(shè)置標(biāo)簽)
- nullexception(標(biāo)簽沒有查找到)
- BroadcastMessage位衩,廣播后,所有的孩子都可以接收到這個(gè)消息熔萧,但是他本身不需要知道接受者是誰(只要看孩子的身上是不是有方法名)糖驴,可以降低耦合性僚祷。
- 沒有接受者,就無法接收贮缕,
target.BroadcastMessage("Attack", null, SendMessageOptions.DontRequireReceiver);//不一定需要接受者辙谜,這樣就不會(huì)報(bào)錯(cuò)了
14.直接在物體上,掛一個(gè)同名方法就好感昼,這樣就能直接叫到装哆,避免多重耦合的情況。(孩子都會(huì)被調(diào)用) - sendMessage(只會(huì)針對(duì)物體一個(gè)抑诸,不會(huì)去叫他的孩子)
- sendMessageUpwards(和BroadcastMessage相反烂琴,用孩子去叫祖先)
- [ExecuteInEditMode],在編輯模式下蜕乡,也能運(yùn)行(加在特定的類上就行)
- Invoke()奸绷, 就是調(diào)用方法
- Coroutine,攜程部分
- InvokeRepeating()层玲,對(duì)某個(gè)方法進(jìn)行間隔調(diào)用
- Invoke号醉,不會(huì)影響別的腳本
- 沒有update(),就不會(huì)被禁用
- Invoke辛块,會(huì)將方法添加在隊(duì)列里面然后等待著畔派,IsInvoking會(huì)去隊(duì)列里面尋找,是不是被調(diào)用著润绵。調(diào)用了以后线椰,就會(huì)從隊(duì)列里移除。
協(xié)程:如果調(diào)用的是一個(gè)協(xié)程方法尘盼,那么調(diào)用完協(xié)程方法后憨愉,不會(huì)等這個(gè)方法執(zhí)行完,就繼續(xù)向下執(zhí)行了卿捎。
普通:如果執(zhí)行的是一個(gè)普通方法配紫,那么會(huì)等這個(gè)普通方法執(zhí)行完,然后繼續(xù)向下執(zhí)行
協(xié)程不會(huì)阻塞程序的執(zhí)行午阵,同時(shí)躺孝,可以在執(zhí)行過程中進(jìn)行暫停。
...
cube.GetComponent<MeshRenderer>().material.color
...
把組件里面的meshrender拿出來
...
Coroutines
1. 返回值是IEnumerator
2. 返回參數(shù)的時(shí)候是使用yield return null/0;
3. 調(diào)用方式:StartCoroutine(Method()); 再封裝一次底桂,開啟協(xié)程,不確定誰會(huì)先運(yùn)行
...
- 協(xié)程的關(guān)閉方式植袍,兩者開啟和關(guān)閉的方式需要意思一樣的
...
private IEnumerator ie;
if (Input.GetKeyDown(KeyCode.Space))
{
ie = Fade();
StartCoroutine(ie);
}
if (Input.GetKeyDown(KeyCode.S))
{
StopCoroutine(ie);
}
...
默認(rèn)時(shí)候,OnMouseUp這些都能做檢測(cè)籽懦,都能檢驗(yàn)出來
但如果有了trigger,就一定要保證project setting里的physcis->queries hit triggers為true
enter, over, exit與鼠標(biāo)按不按下無關(guān)于个,down,drag, up這些是有關(guān)的
OnMouseAsButton,必須要保證,按下和抬起是同一個(gè)物體才會(huì)觸發(fā)
Epsilon, Infinity
leap能做速度有變化的動(dòng)畫(先快后慢)猫十,看起來有幻影览濒,每次移動(dòng)都是恒定比例,不是恒定數(shù)值
mathf.lerp(x,10, Time.deltaTime):按照真的時(shí)間去控制運(yùn)行
mathf.LerpAngle
mathf.MoveToWards拖云,勻速運(yùn)動(dòng)
Mathf.PingPong
input和mathf一樣贷笛,都是靜態(tài)方法
Input.imeselected,和輸入法有關(guān)
-
GetKey宙项,會(huì)一直監(jiān)聽乏苦。GetKeyUp/Down都只會(huì)觸發(fā)一次
40.Conventional Game Input(名字列表),Input.GetKey("直接輸入名字")
Conventional Game Input -
GetKey 和 GetMouseButton都是實(shí)打?qū)嵉陌存I尤筐,GetButton是指虛擬按鍵(我們自己定義的按鍵)汇荐,alt就表示備用的鍵,虛擬按鍵的好處就是盆繁,1)一個(gè)button鍵掀淘,可以對(duì)應(yīng)多個(gè)按鍵 2)名字任意命名,所以比較形象
自定義按鍵 Input.GetButtonDown("Horizontal")油昂,對(duì)軸的話革娄,一般不會(huì)去監(jiān)測(cè)按下和抬起
GetAxis,直接拿漸變的值冕碟,可以模擬加速運(yùn)動(dòng)拦惋,cube.Translate(Vector3.right * Time.deltaTime*Input.GetAxis("Horizontal"));
GetTouch,多指觸摸安寺,可以直接用esayTouch厕妖,更快
acceleration,這個(gè)可以用來檢測(cè)重力挑庶,檢測(cè)陀螺儀言秸,檢測(cè)手機(jī)傾斜角度
46.anykey(鼠標(biāo)+鍵盤)都可以識(shí)別和觸發(fā)mousePositon,像素位置
Camera.main.ScreenPointToRay(); 鼠標(biāo)射線,這樣可以去檢測(cè)是否點(diǎn)到了游戲物體
vector2, 可以表示二維向量挠羔,也可以表示二維坐標(biāo)(下井仰,-y, 上 y;左破加,-x俱恶,右 x)
-
sqrMagnitude,還未開根號(hào)之前范舀,這樣出來的計(jì)算量小一些(性能優(yōu)化)
...
void Start () {
print(Vector2.down);
print(Vector2.up);
print(Vector2.left);
print(Vector2.right);
print(Vector2.one);
print(Vector2.zero);Vector2 a = new Vector2(2, 2); Vector2 b = new Vector2(3, 4); print(a.magnitude); print(a.sqrMagnitude); print(b.magnitude); print(b.sqrMagnitude); print(a.normalized);//不會(huì)對(duì)a有影響合是,只是返回了一個(gè)單位值 print(b.normalized); print(a.x + "," + a.y); print(a[0] + "," + a[1]);
}
... vector2/3,他們倆都是結(jié)構(gòu)體锭环,不是類聪全,結(jié)構(gòu)體就相當(dāng)于把一堆變量做封裝
a=Vector2.MoveTowards(a, target, Time.deltaTime);
Vector3
- vector3.Slerp:在AB之間進(jìn)行差值,ab是兩個(gè)向量辅辩,不是位置难礼,按照夾角娃圆、長度來進(jìn)行差值(適合做轉(zhuǎn)向,轉(zhuǎn)得平滑)
Random
- random.range//生成范圍蛾茉,不包含最大值
- random讼呢,靜態(tài)方法就直接通過類名來調(diào)用就好
- random.IniState, 初始化隨機(jī)種子谦炬,unity會(huì)自動(dòng)默認(rèn)每次生成的數(shù)字都不一樣悦屏,所以inistate可以愛寫不寫
- random.value//直接就是0-1,可以用來做顏色RGB生成
- Random.State;//只要是拿種子
- Random.Rotation;//用來控制四元數(shù)旋轉(zhuǎn),朝向
- Random.insideUnitCircle;//在長度為1的圓里键思,隨機(jī)生成各種二維坐標(biāo)
Quaternion
- x,z軸做自身繞軸旋轉(zhuǎn)础爬,y軸是繞著世界坐標(biāo)做旋轉(zhuǎn)
- 歐拉角(方便觀察)+四元數(shù)(方便計(jì)算)
- print(cube.rotation);//這是四元數(shù)
- cube.rotation = Quaternion.Euler(new Vector3(45, 45, 45));
- Quaternion. LookRotation
- Quaternion.Slerp//跟角度的話,一般都推薦s打頭
RigidBody
- RigidBody. centerOfMass
- RigidBody.Position吼鳞,通過剛體組件來修改位置的話看蚜,transform會(huì)在下一步更新,性能更高赔桌,比transform.position更快
- 直接用move.position失乾,還是這個(gè)比較好,會(huì)更平滑
...
playerRgd.position = playerRgd.transform.position + Vector3.forward * Time.deltaTime;//簡單的幾次沒有問題
playerRgd.MovePosition(playerRgd.transform.position + Vector3.forward * Time.deltaTime*10);//如果是多次改變纬乍,就用這個(gè)
... - 通過剛體直接來修改rotation碱茁,就會(huì)更加快,效果會(huì)更好仿贬,更節(jié)約性能
- MoveRotation, MovePosition
Camera
-
Camera組件的獲取方式
...
public class API16Camera : MonoBehaviour {private Camera mainCamera;
// Use this for initialization
void Start () {
mainCamera=GameObject.Find("MainCamera").GetComponent<Camera>();
mainCamera = Camera.main;//直接用過tag來查找纽竣,但是這個(gè)就要保證tag不能變
}// Update is called once per frame
void Update () {}
}
... 利用鼠標(biāo)射線,探究鼠標(biāo)與物體的碰撞方式
...
void Update () {
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
bool isCollider= Physics.Raycast(ray, out hit);
if (isCollider)
{
Debug.Log(hit.collider);
}
}
...顯示射線方向
Debug.DrawRay(ray.origin, ray.direction * 10, Color.yellow);
射線的起點(diǎn)在屏幕上
Application
-
dataPath
datapath -
Streaming Assets
聲音文件之類的茧泪,可以用datapath去查找
Streaming Assets
里面資源不會(huì)被打包蜓氨,放的是什么路徑,讀取的時(shí)候就是什么路徑队伟,不會(huì)被做成unity的格式穴吹,資源不會(huì)被合并
-
各種目錄
...
void Start () {
print(Application.dataPath);//返回工程所在目錄
print(Application.streamingAssetsPath);//文件流讀取數(shù)據(jù)
print(Application.persistentDataPath);//可以固有化數(shù)據(jù)
print(Application.temporaryCachePath);//臨時(shí)目錄數(shù)據(jù)
}
...
image.png -
Application下常用變量(多靜態(tài))
companyName
identifier(用來表示包名)
installName
installMode
isEditor
isFocused
isPlaying
platform
RuntimePlatform//判斷當(dāng)前的平臺(tái)
isPlaying
Quit
OpenURL
79.Application,做各種自我判斷
...
void Start () {
print(Application.identifier);
print(Application.companyName);
print(Application.productName);
print(Application.installerName);
print(Application.installMode);
print(Application.isEditor);
print(Application.isFocused);
print(Application.isMobilePlatform);
print(Application.isPlaying);
print(Application.platform);
print(Application.unityVersion);
print(Application.version);
print(Application.runInBackground);Application.Quit();//build出來之后使用的 Application.OpenURL("www.sikiedu.com"); ScreenCapture.CaptureScreenshot("游戲截圖");
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.Space))
{
UnityEditor.EditorApplication.isPlaying = false;//只能在編譯器情況下使用
}
}
...
自我判斷
scene
-
AsycOperation.progress
AsycOperation -
SceneManager
sceneManage