這是以前剛開始學(xué)unity時遇到的一些問題的筆記甫菠,現(xiàn)在看來有些幼稚,但是還是發(fā)出來給剛?cè)腴T的同學(xué)參考一下。
1. 如何在game模式下放大縮小視圖:控制camera的size
2.如何獲取圖片的長寬:background is a Gameobject? ? ? ? height = background.GetComponent().sprite.bounds.size.x;? ? ? ? width = background.GetComponent().sprite.bounds.size.y;
3. 手指移動相機并限定移動范圍
```
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)
{
if ((transform.position.x >= leftborder) && (transform.position.x <= rightborder))
{
// Get movement of the finger since last frame
Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;
// Move object across XY plane
transform.Translate(-touchDeltaPosition.x *Time.deltaTime, 0, 0);
}
transform.position = new Vector3(Mathf.Clamp(transform.position.x,leftborder,rightborder),transform.position.y,transform.position.z);
}
```
4. 每秒調(diào)用:InvokeRepeating(string methodName, float time, float repeatRate)
methodName : 要調(diào)用的方法? ;? time:幾秒后開始調(diào)用? ;? repeatRate:? 每幾秒調(diào)用一次
注意:在Start()中使用
5. 如何通過標(biāo)簽find一個物體 :GameObject.FindGameObjectWithTag()
6. Instantiate(Object original, Vector3 position, Quaternion rotation);
在position處創(chuàng)建一個旋轉(zhuǎn)度為rotation的物體original
7. 觸摸輸入:
1) Input.touchCount? 獲取觸摸點數(shù)
2) foreach( Touch touch in Input.touches)? //遍歷觸摸點數(shù)
3) Input.GetTouch(0).phase == TouchPhase.Began? //一旦第一次觸摸
PS: GetTouch( int index )? ? //index是類似觸摸數(shù)組的指針
8. Vector2.magnitude? :求向量的長度
9.unity中的幾種數(shù)據(jù)存儲方式:1)PlayerPrefs 2)ScriptableObjects 3)Databases 4)自定數(shù)據(jù)文件
10. Unity中所有的UI都要放在Canvas中鸯旁,不然沒法渲染
11. Ui中的Grid Layout Group組件(網(wǎng)格布局組):可以把UI當(dāng)成組在一起操作。
屬性:1.padding(墊充)嗜浮,影響ui組在網(wǎng)格中的的初始位置
? ? ? ? ? 2.Cell Size(單個大邢勰丁)
? ? ? ? 3.Space(cell間隔)
? ? ? ? 4.cell組開始布局的角
? ? ? 5.Start Axis(布局橫縱向)
? ? ? 6.Child Alignment (網(wǎng)格中的布局位置)
12. Canvas中Canvas Scaler組件中的 UI Scale Mode(UI儲尺寸模式):1. ConstantPixelSize(尺寸恒定,使用像素大小模式)2. ScaleWithScreenSize(比例隨屏幕大小改變模式)3. ConstantPhysicalSize(恒定外形尺寸危融,由物理單位指定大形访)
13. 可以給Text添加outline/shadow組件,給字體添加效果
14. Canvas的子物體如果顯示過大吉殃,可以通過調(diào)節(jié)物體scale來調(diào)小
15. 物體變大:
```
Another method()
{
StartCoroutine(Scale(new Vector3(0.1f, 0.1f), new Vector3(1, 1)));
}
public IEnumerator Scale(Vector3 from, Vector3 to)
{
float progress = 0;
while (progress <= 1)
{
transform.localScale = Vector3.Lerp(from, to, progress);? //放大
progress += Time.deltaTime;
//print(progress);
yield return null;
}
transform.localScale = to;
}
```
16. 設(shè)置物體的可見辞居,可以使用函數(shù) SetActive(bool)
查看它的可見否屬性使用 (bool) activeInHierarchy
ps: 如果物體一開始就是not active的,那么程序中將入法直接獲取到它蛋勺。
17. 防御范圍可以用 Gizmos類中的Gizmos.DrawWireSphere()設(shè)置一個區(qū)域
18. 鼠標(biāo)移動屏幕:先設(shè)置一個float作為像素高瓦灶,在if判斷中Input.mousePosition的x,y 》= Screen.height – 像素高
19. 滾輪調(diào)節(jié)視角高度:
先設(shè)置一個滾動速度scrollspeed,然后接受一個float scroll來接受Input.GetAxis(“Mouse ScrollWheel”);
然后設(shè)置一個Vector3? pos接受相機位置抱完;然后設(shè)置它pos.y -= scroll * sccrollspeed * Time.deltatime;
注意要限制相機的上下界贼陶, 用clamp()函數(shù)。
20. Physics.OverlapSphere:返回所有在區(qū)域區(qū)域中的collider[];
21. 快速調(diào)節(jié)物體到另一個物體的位置上:右擊物體的Transform組件巧娱,選擇copy component
22. 將實例化的對象放在一個空對象下:virus.transform.parent = Virusparent.transform;
23. 物體調(diào)成Debug模式時可以看到腳本參數(shù)的變化
24. 暫停和繼續(xù):Time.timeScale = 0f; Time.timeScale = 1f;
25. 場景的加載: 調(diào)用UnityEngin.SceneManager中的LoadScene(string)函數(shù),通過改變string實現(xiàn)想不同場景的跳轉(zhuǎn)碉怔。
**重新開始**:SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);? ? 調(diào)用當(dāng)前活躍的場景。同時要設(shè)置? ? ? ? Time.timeScale = 1f;
26. Panel的淡入淡出:? 給panel加一個Canvase Group和animator組件禁添,在animation中創(chuàng)建新動畫撮胧,點選一個時間點將canvase group中的Alpha設(shè)置為0或1;
27. 給按鈕加點擊動畫:將Button組件中的transition選項調(diào)成Animation,然后設(shè)置四個按鈕狀態(tài)的動畫
28. 使用協(xié)程:StartCoroutine(method());
IEnumerator method(){ yield return WaitForSeconds()}? ? 協(xié)程和線程跳轉(zhuǎn)有點像老翘,在wait階段將程序控制權(quán)交出芹啥,執(zhí)行外部代碼锻离,當(dāng)wait階段完成后拿回控制權(quán)繼續(xù)執(zhí)行本段后續(xù)代碼
29. canvas 中UI的自適應(yīng):把錨點拖到對應(yīng)的四個藍色實心點上。更改canvas scaler屬性為如圖:? ? 其中Match為0時表示豎屏墓怀,1時表示橫屏
30. 場景自適應(yīng)問題:改變相機視口汽纠。
實際視口 = 初始視口 * 初始高寬比 / 實際高寬比
31.實現(xiàn)場景的淡入淡出效果:
首先創(chuàng)建一個canvas,在其下創(chuàng)建一個image 并自定義它的顏色傀履。
然后寫一個腳本貼在canvas 上疏虫。
腳本中需要拿到image,并且聲明一個AnimationCurve .在Start 中使用協(xié)程調(diào)用淡入啤呼、淡出函數(shù)。
31. 在update()中調(diào)用有協(xié)程的函數(shù)注意點“:
因為是每幀調(diào)用的所以要設(shè)置一個bool判斷條件再調(diào)用有協(xié)程的函數(shù)呢袱,并且隨后置反官扣,再協(xié)程中再置回。
32. 實現(xiàn)血條:添加Slider羞福,將canvas的坐標(biāo)改為世界坐標(biāo)惕蹄,Slider中的子類物體只留下Fill 和background ,并將Fill置為background子類治专,將Fill的Stretch改為隨父類大新袅辍:Alt + 右下角最后一個。通過修改COLOR設(shè)置前置张峰,后置背景的顏色泪蔫。另外,如果是實現(xiàn)環(huán)形血條喘批,只要把Fill Area下的Fill對象的Source Image設(shè)置為你預(yù)先準(zhǔn)備好的環(huán)形血槽圖片撩荣,然后把Image Type改為Filled,F(xiàn)ill Method改為Radial 360.即可
33. 單機游戲儲存內(nèi)容小饶深,所以可以使用assess數(shù)據(jù)庫餐曹。Access是一種只適合數(shù)據(jù)量少的應(yīng)用的桌面數(shù)據(jù)庫,處理少量和單機訪問的數(shù)據(jù)庫時效率會很高敌厘。
34. 使用DontDestoryOnLoad()時台猴,要確保依附對象為單例模式。避免重復(fù)生成對象俱两。最直觀的反例就是場景切換后背景音樂重疊
35.實現(xiàn)粒子系統(tǒng)檢測碰撞時饱狂,勾選粒子系統(tǒng)下的Trigger選項條,然后設(shè)置Collider對象(被檢測對象)锋华,inside,ouside,enter,exit為觸發(fā)條件(即粒子在對象的各種情況下時觸發(fā))嗡官。可以選擇滿足條件后對應(yīng)的反應(yīng)(ignore,kill,callback)毯焕,ignore為無反應(yīng)衍腥,kill為消除觸發(fā)粒子磺樱,callback是自定義反應(yīng)。要實現(xiàn)callback要在對應(yīng)的新建腳本中使用ParticlePhysicsExtensions.GetTriggerParticles()(以及你要指定的ParticleSystemTriggerEventType)來確定哪些粒子滿足哪些條件婆咸。然后將腳本掛載在對應(yīng)粒子系統(tǒng)上竹捉。詳情見文檔。
36.Physics.Raycast只能用于檢測3d碰撞尚骄,如果要射線檢測2d碰撞用Physics2D.Raycast
37.【四種坐標(biāo)系的轉(zhuǎn)換】
1块差、世界坐標(biāo)→屏幕坐標(biāo):camera.WorldToScreenPoint(transform.position);這樣可以將世界坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo)。其中camera為場景中的camera對象倔丈。
2憨闰、屏幕坐標(biāo)→視口坐標(biāo):camera.ScreenToViewportPoint(Input.GetTouch(0).position);這樣可以將屏幕坐標(biāo)轉(zhuǎn)換為視口坐標(biāo)。其中camera為場景中的camera對象需五。
3鹉动、視口坐標(biāo)→屏幕坐標(biāo):camera.ViewportToScreenPoint();
4、視口坐標(biāo)→世界坐標(biāo):camera.ViewportToWorldPoint();
5. 絕對坐標(biāo)轉(zhuǎn)相對坐標(biāo) InverseTransformPoint(transform.position);
Debug.Log(vec);//打印出來是(0宏邮,0泽示,0);與上面不一樣
6. ? 相對坐標(biāo)轉(zhuǎn)絕對坐標(biāo) ? ? ?transform.TransformPoint(transform.localposition);
38.鉸鏈(hinge joint)
39.animation播放動畫:If you select your animation in theProjectwindow, then go to the top right corner of theInspectorwindow and selectDebugfrom the drop down menu (next to the lock), then change theAnimation Typeto 1 will mark it as Legacy.
40.**UI字體縮小模糊**:canvas渲染模式調(diào)成世界空間蜜氨,scale factor/Dynamic Pixel調(diào)大些
41.碰撞器之間會相互影響械筛,設(shè)置其Layer有助于物理分類
42.Project Setting中的TixedTimeStep :值越小,物理計算越頻繁
43.我們以前所玩的游戲中飒炎,主人公身上依附著一只寵物如鷹埋哟,主人公移動時,鷹會跟隨著飛動郎汪,主人公移動得快它就飛行跟動得快定欧,始終不會離開主人公,使用Lerp插值函數(shù)就可實現(xiàn)怒竿。
44.Transform中eularAngle的取值范圍是(0砍鸠,360).
45. 更改天空盒可以在lighting設(shè)置中完成
46.通過腳本使用SetActive的注意點:不可以直接由GameObject.Find來設(shè)置可見性,而是應(yīng)該通過GameObject.Find("可見父類物體名").transform.Find("不可見子物體名")來設(shè)置可見性耕驰。還有一種是通過public指定實現(xiàn)爷辱,較為常用。
47.EventSystem.current.currentSelectedGameObject.name 獲取點擊物體的名字
48.通過腳本綁定點擊事件:Button.onClick.AddListener
49.unity中的CPU幀率低了會有一種卡的感覺朦肘,高了會對性能要求高饭弓。適合的是30-60fps
50.兩次點擊退出
```
if (Input.GetKeyDown(KeyCode.Escape))
?? ? ? ?{
? ? ? ? ? ? clickTimes++;
?? ? ? ? ? if (clickTimes == 1) {
? ? i1 = Time.time;
? ? ? ? ? ? }
?? ? ? ? ? ?if (clickTimes == 2)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? i2 = Time.time;
? ? ? ? ? ? ? ? if (i2 - i1 <= 2f)
? ? ? ? ? ? ? ? ? ? Application.Quit();
? ? ? ? ? ? }
? ? ? ? }
```
51.動態(tài)更改材質(zhì) 在MeshRenderer組件下的屬性中
52. 簡單的單例模式:
```
public static Manager instance = null;
void Awake()
? ? {
? ? ? ? if (instance != null)
? ? ? ? ? ? return;
? ? ? ? instance = this;
? ? }
```
53. 線性插值理解
插值有三個參數(shù)(起始,終點媒抠,百分比)弟断。百分比定義**移動步長【(終點 - 起始)*百分比】**。它的應(yīng)用有Mathf.Lerp趴生。Vector,Color下的Lerp函數(shù)本質(zhì)是相同的阀趴』韬玻可以通過Lerp函數(shù)給目標(biāo)值循環(huán)賦值,能實現(xiàn)線性變化刘急。
```
voidUpdate ()
{?
//以幀為變化頻率
?light.intensity=Mathf.Lerp(light.intensity,8f, 0.5f);
//以時間為變化頻率
light.intensity=Mathf.Lerp(light.intensity,8f, 0.5f*Time.deltaTime);
}
```
54.以自身坐標(biāo)做移動棚菊。transform.Translate(Vector3 , Space.Self)