敵人移動
-
在”Frog“的”Inspector視窗“中添加”New script“,命名為”Enemy_Frog.cs“,
-
在”Frog“中”Create Empty“,分別命名為”left“和”right“,調整位置(如果看不見點,在”Scene視窗“中點擊”Gizmos“即可顯示),
-
打開”Enemy_Frog.cs“,添加代碼:
private Rigidbody2D rb; public Transform leftPoint, rightPoint; -
將”Frog“的”left“和”right“選進“Script視窗”的“leftPoint”和“rightPoint”中,、
-
添加代碼:
public float speed; private float leftx, rightx;//記錄leftPoint, rightPoint的位置 private bool faceLeft = true;//默認瓜娃子面向左 -
添加Start方法:
void Start() { rb = GetComponent<Rigidbody2D>();//獲得剛體 transform.DetachChildren(); //注意這句,當敵人轉向時,其孩子leftPoint, rightPoint也隨之轉向,導致Frog抽搐 //DetachChildren所有子物體解除父子關系 //當游戲開始后,leftPoint, rightPoint不在是Frog的孩子,就不會隨之反轉 leftx = leftPoint.position.x;//記錄leftPoint, rightPoint的位置 rightx = rightPoint.position.x; Destroy(leftPoint.gameObject);//記錄完位置后就銷毀兩點 Destroy(rightPoint.gameObject); } -
添加Movement方法:
void Update() { Movement(); } void Movement() { if (faceLeft) { rb.velocity = new Vector2(-speed,rb.velocity.y);//向左移動為-speed if (transform.position.x < leftx)//Frog到達leftPoint { transform.localScale=new Vector3(-1,1,1);//令x==-1使其朝向右 faceLeft = false; } } else { rb.velocity = new Vector2(speed, rb.velocity.y); if (transform.position.x > rightx) { transform.localScale=new Vector3(1,1,1); faceLeft = true; } } } -
保存,瓜娃子就動起來了,將“Frog”移動到“Prefabs檔案夾”中,就可重復使用,
敵人影片
-
點擊Prefabs檔案夾中的“Frog”,在Animation視窗中分別添加”idle“、”jump“、”fall“三個影片,并設定好Samples
-
“Animator視窗“中分別連接“idle -> jump”、“jump -> fall”、“fall -> idle”,并設定好條件與相關引數
-
在idle影片中結束點”Add event“,并在inspector視窗中在”function“中添加”Enemy_Frog.cs“中的Movement()方法,此舉實作當idle影片結束后才進行jump影片
-
打開Enemy_Frog.cs,添加代碼:
private Animator anim; private Collider2D coll; public LayerMask ground; public float speed, jumpForce; -
在Frog的inspector視窗中的Script選項的Ground選擇已經創建好的”Ground“
-
在Start方法中添加代碼:
anim = GetComponent<Animator>(); coll = GetComponent<Collider2D>(); -
洗掉Update方法中呼叫Movement方法陳述句,并呼叫SwitchAnim方法
-
修改Movement方法
void Movement() { if (faceLeft) { if (coll.IsTouchingLayers(ground))//判斷是否觸碰到地面 { if (transform.position.x < leftx) { transform.localScale=new Vector3(-1,1,1); faceLeft = false; } anim.SetBool("jumping",true); rb.velocity = new Vector2(-speed,jumpForce); } } else { if (coll.IsTouchingLayers(ground)) { if (transform.position.x > rightx) { transform.localScale=new Vector3(1,1,1); faceLeft = true; } anim.SetBool("jumping",true); rb.velocity = new Vector2(speed, jumpForce); } } } -
添加SwitchAnim方法:
void SwitchAnim() { if (anim.GetBool("jumping")) { if (rb.velocity.y < 0.1) { anim.SetBool("jumping",false); anim.SetBool("falling",true); } } if (coll.IsTouchingLayers(ground) && anim.GetBool("falling")) { anim.SetBool("falling",false); } } -
以下是死亡影片的步驟:先正常在Frog的Animation中添加“die”影片,并“Any State -> die”,在Parameters中添加一個“Trigger”為“death”,并將條件設定為“death”,調整相關引數
-
在”Enemy_Frog.cs“中添加代碼:
void Death() { Destroy(gameObject);//在die影片后添加event呼叫Death() } public void JumpOn() { //在PlayerController中呼叫該方法 anim.SetTrigger("death");//開啟die的條件 } -
修改”Player Controler.cs“的“OnCollisionEnter2D(Collision2D collision)”方法中的代碼:
if (collision.gameObject.tag == "Enemy") { Enemy_Frog frog = collision.gameObject.GetComponent<Enemy_Frog>(); //創建Enemy_Frog類的實體 if(anim.GetBool("falling")) { frog.JumpOn();呼叫frog的死亡影片 rb.velocity = new Vector2(rb.velocity.x, jumpForce * Time.deltaTime); anim.SetBool("jumping", true); } else if (transform.position.x < collision.gameObject.transform.position.x) { rb.velocity = new Vector2(-10,rb.velocity.y); isHurt = true; } else if (transform.position.x > collision.gameObject.transform.position.x) { rb.velocity=new Vector2(10,rb.velocity.y); isHurt = true; } } -
以下是有關父子級的知識點,創建一個新類“Enemy”,修改”Enemy_Frog.cs“中代碼:
public class Enemy_Frog : Enemy//繼承自Enemy類,而不是MonoBehavior { …… } -
在“Enemy”中添加代碼:
protected Animator anim; // Start is called before the first frame update protected virtual void Start()//注意使用protected virtual,使子級能夠重寫該方法 { anim = GetComponent<Animator>(); } public void Death()//注意使用public { Destroy(gameObject);//在die影片后添加event呼叫Death() } public void JumpOn()//注意使用public { anim.SetTrigger("death"); }在“Enemy_Frog”中修改代碼:
protected override void Start()//注意使用protected override { base.Start();//獲得父級的Start() rb = GetComponent<Rigidbody2D>(); coll = GetComponent<Collider2D>(); transform.DetachChildren(); leftx = leftPoint.position.x; rightx = rightPoint.position.x; Destroy(leftPoint.gameObject); Destroy(rightPoint.gameObject); } -
修改”Player Controler.cs“的“OnCollisionEnter2D(Collision2D collision)”方法中的代碼:
/*Enemy_Frog frog = collision.gameObject.GetComponent<Enemy_Frog>();//呼叫frog的死亡影片*/ Enemy enemy = collision.gameObject.GetComponent<Enemy>(); …… /*frog.JumpOn();*/ enemy.JumpOn();
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/157528.html
標籤:其他
上一篇:Unity3D學習(二)
下一篇:2019山東ACM省賽補題題解
