一、豌豆射手的子彈控制
創(chuàng)建腳本單獨(dú)控制子彈的運(yùn)動(dòng)
用transform來(lái)控制移動(dòng)
? ? void Update()
? ? {
? ? ? ? transform.Translate(Vector3.right * speed * Time.deltaTime);
? ? }
創(chuàng)建一個(gè)控制子彈速度的方法,方便速度的控制
private void SetSpeed(float speet)
? ? {
? ? ? ? this.speed = speet;
? ? }
回到控制豌豆射手的腳本中,當(dāng)調(diào)用他的射擊方法時(shí)去實(shí)例化子彈這樣就能實(shí)現(xiàn)豌豆射手的攻擊了。
? ? private void shoot()
? ? {
? ? ? ? BulletControl go = GameObject.Instantiate(PeaBulletPrefab, shootPointTransform.position, Quaternion.identity);
? ? ? ? go.SetSpeed(BulletSpeet);
? ? }
效果如下:
二、僵尸動(dòng)畫(huà)的開(kāi)發(fā)
普通的僵尸有五個(gè)動(dòng)畫(huà)狀態(tài)Eat 、Move、LostHeadMove、LostHandMove,Die他們之間的相互轉(zhuǎn)換關(guān)系如下:
在制作動(dòng)畫(huà)時(shí),幀動(dòng)畫(huà)可以直接拖拽到游戲物體上,相當(dāng)于給游戲物體上的動(dòng)畫(huà)狀態(tài)機(jī)添加新的動(dòng)畫(huà)。
添加動(dòng)畫(huà)后,效果如下:
在Zombie_Move和Zombie_Eat通過(guò)一個(gè)布爾變量來(lái)控,當(dāng)控制到敵人時(shí)就開(kāi)Eat,沒(méi)有碰到植物就Move。
當(dāng)IsAttacking為true時(shí),就會(huì)播放Eat動(dòng)畫(huà),然后將退出時(shí)間取消表示隨時(shí)都可以切換。
Move動(dòng)畫(huà)和LostHeadMove的切換時(shí)當(dāng)血量達(dá)到某個(gè)值的時(shí)候進(jìn)行切換,添加一個(gè)float類(lèi)型的參數(shù),
Eat動(dòng)畫(huà)和LostHeadEat的切換條件也是一樣的
其他動(dòng)畫(huà)狀態(tài)的切換也是類(lèi)似設(shè)置。
設(shè)置好了之后,當(dāng)參數(shù)達(dá)到對(duì)應(yīng)的值之后就會(huì)進(jìn)行不同狀態(tài)的切換。
測(cè)試效果如下:
三、僵尸功能開(kāi)發(fā)
1.行走功能
僵尸需要和植物之間進(jìn)行檢測(cè),因此要在僵尸上添加剛體組件,既然僵尸身上有剛體組件,那么就可以使用剛體組件來(lái)控制他的移動(dòng)。
因此就要為其添加剛體和碰撞器
Rigldbody 2D 、Box Collider 2D。
在僵尸的腳本上拿到剛體的引用
private Rigidbody2D rgd;
在start函數(shù)中獲取這個(gè)剛體組件
rgd = GetComponent<Rigidbody2D>();
然后通過(guò)MovePosition方法來(lái)進(jìn)行移動(dòng)
rgd.MovePosition(rgd.position + Vector2.left * moveSpeed * Time.deltaTime);
當(dāng)前的位置加上移動(dòng)的方向乘以移動(dòng)的速度和時(shí)間
2.攻擊功能
這個(gè)攻擊功能通過(guò)觸發(fā)檢測(cè)來(lái)進(jìn)行控制,將僵尸物體的Collider組件設(shè)置為觸發(fā)器,
然后再為每個(gè)植物添加一個(gè)觸發(fā)器。這樣僵尸和植物之間就能進(jìn)行觸發(fā)檢測(cè)了。
這里會(huì)出現(xiàn)一個(gè)問(wèn)題:植物無(wú)法被正常種植在地面上。
這是由于地面上也有觸發(fā)器,植物上的剛體會(huì)將地面上的覆蓋掉。
解決辦法是:在植物處于禁用狀態(tài)時(shí)將Box Collider 2D組件禁用掉,只有當(dāng)植物處于啟用狀態(tài)時(shí),再將Box Collider 2D組件啟用。
要確保僵尸植物進(jìn)行觸發(fā)檢測(cè),為所有植物添加一個(gè)標(biāo)簽plant。
在腳本中調(diào)用出發(fā)檢測(cè)的方法,當(dāng)與其碰撞的物體的標(biāo)簽為plant時(shí),就會(huì)執(zhí)行Eat動(dòng)畫(huà)
要執(zhí)行Eat動(dòng)畫(huà),就要獲取animation組件,
private Animator animator;
animator = GetComponent<Animator>();
然后通過(guò)OnTriggerEnter2D方法設(shè)置Isattacking參數(shù)為true,通過(guò)OnTriggerExit2D方法設(shè)置Isattacking參數(shù)為false。
? ? private void OnTriggerEnter2D(Collider2D collision)
? ? {
? ? ? ? if (collision.tag == "plant")
? ? ? ? {
? ? ? ? ? ? animator.SetBool("IsAttacking", true);
? ? ? ? }
? ? }
? ? private void OnTriggerExit2D(Collider2D collision)
? ? {
? ? ? ? if(collision.tag == "plant")
? ? ? ? {
? ? ? ? ? ? animator.SetBool("IsAttacking", false);
? ? ? ? }
? ? }
當(dāng)觸發(fā)器與植物碰撞時(shí)開(kāi)啟攻擊動(dòng)畫(huà),當(dāng)觸發(fā)器與植物分離時(shí)停止攻擊動(dòng)畫(huà)的功能。
效果如下:
此時(shí)會(huì)發(fā)現(xiàn)僵尸是在一邊移動(dòng)一邊吃植物,因此還要為僵尸設(shè)置三個(gè)狀態(tài),在對(duì)應(yīng)的狀態(tài)播放對(duì)應(yīng)的動(dòng)畫(huà)
enum ZombieState
{
? ? Move,
? ? Eat,
? ? Die
}
ZombieState zombieState = ZombieState.Move;//設(shè)置默認(rèn)狀態(tài)
通過(guò)switch方法來(lái)對(duì)不同的狀態(tài)進(jìn)行判斷,進(jìn)而執(zhí)行對(duì)應(yīng)的方法。
? void Update()
? ? {
? ? ? ? switch (zombieState)
? ? ? ? {
? ? ? ? ? ? case ZombieState.Move:
? ? ? ? ? ? ? ? MoveUpdate();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case ZombieState.Eat:
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case ZombieState.Die:
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? default:
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? ? ??
? ? }
最后效果如下:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-823162.html
當(dāng)接觸到植物時(shí)只會(huì)進(jìn)行eat動(dòng)畫(huà),當(dāng)植物被移除時(shí)只會(huì)進(jìn)行move動(dòng)畫(huà)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-823162.html
到了這里,關(guān)于unity學(xué)習(xí)筆記----游戲練習(xí)06的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!