1. 程式人生 > >【SIKIA計劃】_06_Unity2D遊戲開發-拾荒者筆記

【SIKIA計劃】_06_Unity2D遊戲開發-拾荒者筆記

【新增分類】

Animations 動畫

——Animation

——AnimatorController

Prefabs 預製

 

【素材匯入】

unitypackage 素材包

Sprites Editor 編輯圖片(切圖之類)

 

【素材應用】

1.選取一個動作多張圖片拖動到Hierarchy生成動畫

2.帶有Sprite Renderer和Animator元件

3.在project會生成anim(動畫)和controller(控制)檔案

4.選取另一個動作多張圖片拖拽到剛生成的物體則不會建立新物體

5.把物體拖拽到project生成預製體

 

(同一控制不同動畫處理)

6.右鍵建立Animator Overide Controller重寫一個相同的控制器,指定重寫物件

7.把2動畫借1物體生成動畫,並改1物體指定控制和重寫的狀態機指定動畫。

 

 

【動畫編輯】【動畫狀態機】

Animator 動畫編輯器 狀態機

idle 待命

attack 攻擊

damger 受傷

 

Trigger

——Has Exit Time 前一個動畫播放完觸發

——Exit Time 多久進行切換

——Transition Duration 轉化時間(3D需要融合時間)

 

[動畫元件]

private Animator animator;

 

animator = GetComponent<Animator>();

 

animator.SetTrigger("Attack");

 

 

【固定生成】【設定父類】

//建立一個空物體,建立指令碼

GameObject[] outWallArray;

//指定預設物體

private Transform mapHolder;(1)

//地址

public int rows=10;

public int cols=10;

 

private void InitMap(){

//初始化地圖,

mapHolder = new GameObject("Map").transform;(2)

for(int x=0;x<cols;x++){

for(int y =0; y <rows;y++){

if(x==0||y==0||x==cols-1||y==rows-1){

int index = Random.Range(0,outWallArray,length)

GameObject go = GameObject.Instantiate(outWallArray[index],new vector3(x,y,0),Quaternion.identity)as GameObject;

//物件,位置,旋轉

go.transform.SetParent(mapHolder):(3)

//設定父類

}

}

}

}

 

【隨機生成】【List的使用】

public GameObject[] wallArray;

public int minCountWall = 2;

public int maiCountWall = 8;

private List<Vector2> polistionList = new List<Vector2>();

positionList.Clear();

for(int x = 2; x < cols-2;x++){

for(int y = 2; y < cols-2;y++){

positionList.Add(new Vector2(x,y))

}

}

//障礙物的地址

int wallCount = Random.Range(minCountWall, maxCountWall + 1);、

//障礙物的個數

for(int i = 0;i <wallCount;i++){

int positionIndex = Random.Rabge(0,positionList.Count)

Vector2 pos = positionList[positionIndex];

positionList.Remove(positionIndex);

//隨機取得位置,移出列表

int wallIndex = Random.Range(0,wallArray.length);

//隨機取得障礙物

GameObject go = GameObject.Instantiate(wallArray[wallIndex],pos,Quaternion.identity) as GameObject ;

go.transform.SetParent(mapHolder):

}

注意:記得設定牆體和障礙物層數

 

【互相呼叫】

同一物體兩個元件

{GameManager}

public int level

{MapManager}

private GameManager gameManager;

gameManager = this.GetComponent<GameManager>();

 

不同物體兩個元件

{GameManager}

public List<Enemy> enemyList = new List<Enemy>();

{Enemy}

GameManager.Instance.enemyList.Add(this);

 

【預設輸入】

float h = Input.GetAxisRaw("Horizontal");

float h = Input.GetAxisRaw("Vertical");

if(h>0){

v = 0;

}

 

【剛體元件】

rigidbody.MovePosition(Vector2.Lerp(transform.position,targetPos.smoothing*Time.deltaTime));

//差值(初始位置,目標位置,速度)

 

【計時休息】

public float restTimer = 1;//限時多少

private float restTime = 0;//計時器

restTimer += Time.deltaTime;

if(restTimer<restTime)retrun;

//執行

restTimer = 0;

 

【目標檢測】

colider.enabled = false; //自身collider禁用

RaycastHit2D hit = Physics2D.Linecast(targetPos,targetPos + new Vector2(h,v));

//初始位置,目標位置

collider.enabled = true;

if(hit.transform == null){

targetPos += new Vector2(h,v);

}else{

switch(hit.collider.tag) {

case"OutWall"

break;

case"Wall"

hit.collider.SendMessage("TakeDamage")

}

}

restTimer = 0;

//碰撞到物體標籤

 

【物體查詢】

private Transform player

player = GameObject.FindGameObjectWithTag("player").transform;

 

【AI判斷】

Vector2 offset = player.position - transform.position;

if(offset.magnitude<1.1f){

//攻擊

}else{

float x = 0, y = 0;

if(Mathf.Abs(offset.y)>Mathf.Abs(offset.x)){

//按照Y軸移動,絕對值

if(offset.y<0){

y = -1;

}else

{

y = 1;

}

}else{

//按照x軸移動

if(offset.x > 0){

x = 1;

}else{

x = -1;

}

}

tagetPosition +=new Vector2(x,y);

}

 

【開啟禁用】

this.enabled = false;//禁用該指令碼

if(GameManager.Instance.food)

 

private Text foodText;

foodText = GameObject.Find("FailText").GetComponent<Text>();

failText.enabled = false;

failText.enabled = true

 

[HideInspector]public Vector2 targetPos = new Vector2(1,1);

 

DontDestroyOnload(gameObject);//不要銷燬

 

void HideBlack(){

dayImage.gameObject.SetActive(false);

}

Invoke("HideBlack",1)//經過一秒呼叫

 

【關卡變化】

Application.LoadLevel(Application.loadedLevel);//重新載入本關卡

 

void OnLevelWasLoaded (int sceneLevel){

Level++;

InitGame();//初始化遊戲

}

 

【例項化】

GameManager放在預設裡

在Main Camer新增一個新指令碼Leader

public GameObjiect gameManager;

void Awake(){

if(GameManager.Instance==null)//等於空才進行例項化

GameObject.Instantiate(gameManager);

}

 

【音效播放】

public float minPitch = 0.9f;

public float manPitch = 1.1f;

public AudioSource efxSource;

 

public void RandomPlay(params AudioClip[] clips){

float pitch = Random.Range(minPitch,manPitch);

int index = Random.Range(0,clips.Length);

AudioClip clip = clips[index];

efxSource.clip =clip;

efxSource.pitch = pitch;

efxSource.Play();

}