敵機要反擊跟Player設定差不了多少,首先也讓敵機自動發射個子彈,找到素材把Enemy Bullet0~3拖曳到場景上,記得更改一下場景的圖層Layer,看是要換圖層還是把圖層的層級往前…
這顆子彈是從上往下,在Sprite Renderer裡的Flip的Y打勾(這樣這整副圖的Y軸會顛倒,2D人物的左右翻轉很常用這得X值),為了子彈動作流暢一點我把Animation最後一針複製一個(最後多停留一點點時間感覺比較順暢) ,Tag也可敵機子彈一個自訂的標籤暫名EnemyBullet,再加上一個Collider給子彈,記得勾is Trigger,之後一樣給子彈一個程式暫名EnemyBullet
可以把之前的子彈程式稍微修改一點即可
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyBullet : MonoBehaviour
{
private float speed = 5f;
void Start()
{
Destroy(gameObject, 5);
}
// Update is called once per frame
void Update()
{
//原先的往上改成往下即可
transform.Translate(Vector3.down * speed * Time.deltaTime, Space.World);
}
}
接下來讓敵機射出子彈,一樣把敵機子彈做成預置物,在修改一下敵機程式放上去
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyAI : MonoBehaviour
{
private Animator anim;
[SerializeField] float speed = 3f;
bool right;
[SerializeField] float hp = 100f;
//序列劃一個物件名叫 enemyBullet(在unity記得放入欲置物的子彈)
[SerializeField] GameObject enemyBullet = null;
void Start()
{
right = true;
anim = GetComponent<Animator>();
//一秒後反覆2秒執行Attack
InvokeRepeating("Attack", 1f, 2f);
}
// Update is called once per frame
void Update()
{
Move();
}
void Move()
{
if (!right)
{
transform.Translate(speed * -1 * Time.deltaTime, 0, 0);
if (gameObject.transform.position.x <= 0.5)
right = true;
}
if (right)
{
transform.Translate(speed * 1 * Time.deltaTime, 0, 0);
if (gameObject.transform.position.x >=5.5)
right = false;
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.tag == "PlayerBullet")
{
hp -= 5f;
anim.SetTrigger("hit");
if (hp <= 0)
Destroy(gameObject);
}
}
void Attack()
{
//創造一個(物件(enemyBullet),在自身位置,自身角度)
Instantiate(enemyBullet, transform.position, Quaternion.identity);
}
}
我發現敵機子彈程式中若有Destroy(gameObject, 5);這行就過五秒沒子彈可用,
還會出現這物件已摧毀但仍嘗試呼叫的錯誤訊息,
但這明明player子彈的程式也有就沒問題,
要是敵機子彈程式中拿掉這行就會有您之前說的消耗資源越來越慢的問題,
請問要如何解決這奇怪的敵機子彈問題?
子彈的物件要從預置物的資料夾裡面拿取
從場景上的預置物(場景上本身還是開始就會算5秒消除...所以五秒後場景上的物件預置物消失,程式找不到預置物自然會報錯)
有點刻意留的小問題 慢慢就會處理這些小問題大概就能自己寫囉 ^^