該程式是 Unity,我正在嘗試制造一顆跟隨敵人的子彈。但是敵人的游戲物件是一個陣列(它們產生的數量與波浪的數量一樣多)所以我試圖將子彈實體化為波浪的數量并瞄準每個敵人。
我使用陣列的原因是因為敵人有兩種型別:0 = 敵人,1 = 快速敵人
public class SpawnManager : MonoBehaviour
{
public GameObject powerupPrefab;
public GameObject[] enemyPrefab;
public GameObject bullet;
public GameObject player;
private float spawnRange = 9;
public float bulletSpeed;
public int enemyCount;
public int waveNumber;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
enemyCount = GameObject.FindGameObjectsWithTag("Enemy").Length;
if (enemyCount == 0)
{
waveNumber ;
SpawnEnemyWave(waveNumber, Random.Range(0, enemyPrefab.Length));
}
for (int i = 0; i < waveNumber; i )
{
Instantiate(bullet, bullet.transform.position, bulletRotation);
BulletMove();
}
}
void BulletMove(GameObject[] enemy)
{
Vector3 lookDirection = (enemy.transform.position - transform.position).normalized;
bullet.GetComponent<Rigidbody>().AddForce(lookDirection * bulletSpeed);
}
void SpawnEnemyWave(int enemiesToSpawn, int index)
{
for (int i = 0; i < enemiesToSpawn; i )
{
index = Random.Range(0, enemyPrefab.Length);
Instantiate(enemyPrefab[index].gameObject, GenerateSpawnPosition(), enemyPrefab[index].gameObject.transform.rotation);
}
}
我希望這段代碼能讓每枚導彈瞄準每個敵人并跟隨敵人,但我無法弄清楚如何讓每枚導彈瞄準陣列中的每個敵人。但是出現錯誤 CS0103、CS7036 和 CS1061。
uj5u.com熱心網友回復:
這里有一些明顯的短視,但我會盡力幫助你。
首先你沒有一個 Enemy 那是一個陣列,你有一個 Enemies 陣列。這意味著您可以將敵人的 GameObject 存盤在 GameObject[] 中,因此您無法訪問 GameObject[] 中的 GameObject 函式,您需要任意迭代或訪問陣列中的每個 GameObject 。
其次,如果你不完成它,你就不能指望你的代碼能夠作業,缺少屬性和變數,這在你做草圖時很好但是現在你對你的代碼沒有運行而你的代碼沒有完全實作感到困惑,您需要檢查編輯器上的警告和錯誤,顯然代碼錯誤 CS0103 表示The name 'enemyCount' does not exist in the current context您要么寫錯了,要么嘗試從其他腳本訪問而不參考或正確訪問,要么您一開始就沒有創建。在此處查看 C# 基礎知識,在此處查看統一基礎知識
我試圖填補您代碼中的一些空白,但這絕不是一個有效的腳本,這里有一些關鍵:
- 不要為每個敵人實體化每一幀一顆子彈,設定一個定時器或一個輸入按鈕來觸發射擊;
- 跟蹤串列中的敵人并在他們死亡時將其從串列中移除,這樣可以節省一些性能;
- 最后,添加一些邏輯來存盤每顆子彈瞄準的敵人,這樣它就可以跟隨同一個敵人,這可以通過字典來完成,其中你有一個帶有價值子彈或子彈串列的關鍵敵人;
一開始可能會很亂,所以放輕松,一步一步寫代碼,看錯誤描述,如果不明白就搜索它。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpawnManager : MonoBehaviour
{
public GameObject powerupPrefab;
public GameObject[] enemyPrefabs;//plural for collections
public GameObject bullet;
public GameObject player;
private float spawnRange = 9;
public float bulletSpeed;
public int enemyCount;
public int waveNumber;
// Update is called once per frame
void Update()
{
GameObject[] enemies;//added GameObject array to store the enemies
enemies = GameObject.FindGameObjectsWithTag("Enemy"); //stored the enemies Array
//I think you would be better keeping score of the Enemies as they die instead of searching for them every frame
enemyCount = enemies.Length; //store the lenght of the enemies array
if (enemyCount == 0)
{
waveNumber ;
SpawnEnemyWave(waveNumber, Random.Range(0, enemyPrefabs.Length));
}
//this will create 1 bullet per enemy every frame
for (int i = 0; i < waveNumber; i )
{
Instantiate(bullet, bullet.transform.parent.transform.position, Quaternion.identity); //get the position of the parent instead of the transform and removed the rotation
BulletMove(enemies);//added enemies to the method
}
}
void BulletMove(GameObject[] enemies)
{
foreach (var enemy in enemies) //iterate through the array to accees each enemy
{
Vector3 lookDirection = (enemy.transform.position - transform.position).normalized;
bullet.GetComponent<Rigidbody>().AddForce(lookDirection * bulletSpeed);
}
}
void SpawnEnemyWave(int enemiesToSpawn, int index)
{
for (int i = 0; i < enemiesToSpawn; i )
{
//you are sending the index so no need to set it here as well
Instantiate(enemyPrefabs[index], GenerateSpawnPosition(), enemyPrefabs[index].transform.rotation);//remove the .gameobject since enemy prefabs are gameobjects
}
}
private Vector3 GenerateSpawnPosition()
{
//you need to create this logic yet
/* return new Vector3(
Random.Range(enemySpawnBounds.x),
Random.Range(enemySpawnBounds.y),
Random.Range(enemySpawnBounds.z));*/
throw new System.NotImplementedException();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/534994.html
標籤:C#数组unity3d
上一篇:無法獲取從基類派生的組件,泛型定義為Unity中的介面
下一篇:檢查活動子物件的子計數
