gpt4 book ai didi

c# - 可以在 Unity3D 中创建更高效​​的寻的导弹系统吗?

转载 作者:行者123 更新时间:2023-11-30 16:37:31 26 4
gpt4 key购买 nike

我已经为我的 Action 平台游戏编写了一个寻的导弹脚本,我忍不住注意到这可能不是最有效的武器。

void Start()
{
target = GameObject.FindGameObjectWithTag("Enemy");
rb = GetComponent<Rigidbody2D>();
}

// Update is called once per frame
void FixedUpdate()
{
direction = (target.transform.position - transform.position).normalized;
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
rotatetoTarget = Quaternion.AngleAxis(angle, Vector3.forward);
transform.rotation = Quaternion.Slerp(transform.rotation, rotatetoTarget, Time.deltaTime * rotationSpeed);
rb.velocity = new Vector2(direction.x * fowrardSpeed, direction.y * fowrardSpeed);
}

它运行良好,但存在一些问题。我如何让它在每次实例化时随机选择一个不同的敌人?而不是所有人都为一个敌人而战?

同样,一旦那个敌人死了,它应该选择一个新的目标,但是在 Update() 中执行 GameObject.Find() 不是一件坏事吗?我知道 GameObject.Find() 是要避免的,因为它会遍历场景中的所有游戏对象,直到找到它正在寻找的东西,如果需要的话,应该只在 开始()。现在我不得不在武器实例化时使用 GameObject.Find(),因为我找不到任何其他方法来定位武器的目标。那么有没有更好的方法在目标被摧毁后选择一个新的目标呢?我的游戏是一款 react 时间很重要的游戏,我不想因为这种武器而造成任何不必要的延迟

谢谢

最佳答案

你可以有一个 EnemyCacheMissileSpawner 脚本。

您的 EnemyCache(很可能是单例)将包含世界上的敌人列表;
敌人在生成时被添加到该列表中,并在他们死亡时从该列表中删除。

您的 MissileSpawner(或产生射弹的东西)脚本随后需要在每次产生新导弹时为导弹分配一个目标。
它可以通过 EnemyCache 获取新导弹的目标。 (您甚至可以过滤列表以获得最近的目标!)

最后,如果旧目标死亡,您的导弹脚本可以从 EnemyCache 获取新目标。

总体而言,它应该看起来类似于:

你的导弹.cs

public class YourMissile : MonoBehaviour {
// ...

GameObject target;

public void Update() {
// target is destroyed or gone
if (target == null) {
SetTargetFromEnemyCache();
}
}

private void SetTargetFromEnemyCache() {
if (EnemyCache.Instance.TryGetFirstEnemy(out Enemy newTarget)) {
target = newTarget.gameObject;
} else {
Debug.LogWarning("No enemy for missile to target!");
}
}

// ...

public void SetTarget(GameObject targetToSet) {
target = targetToSet;
}

// ...
}

敌人缓存.cs

public class EnemyCache : MonoBehaviour {
// Singleton
public static EnemyCache Instance { get; private set; }

private List<Enemy> cachedEnemies;

private void Awake() {
Instance = this;
cachedEnemies = new List<Enemy>();
// TODO: Subscribe to a delegate or event, that adds into the 'cachedEnemy' whenever an enemies spawned.
// Also, an event that removes from 'cachedEnemy' when an enemy dies too.
}

// ...

/// <summary>
/// Tries to fetch the first enemy in the cache.
/// </summary>
/// <param name="enemy">The fetched enemy; Null if there was nothing in cache</param>
/// <returns>True if there is an enemy fetched; False if none</returns>
public bool TryGetFirstEnemy(out Enemy enemy) {
if (cachedEnemies.Count > 0) {
enemy = cachedEnemies[0];
return true;
}
enemy = null;
return false;
}
}

你的MissileSpawner.cs

public class YourMissileSpawner : MonoBehaviour {
[SerializeField]
private YourMissile missilePrefab;

// ...

public void SpawnProjectile() {
YourMissile newMissile = Instantiate(missilePrefab);

// Set position... etc...

// Try to get a target for the new missile
if (EnemyCache.Instance.TryGetFirstEnemy(out Enemy enemyToTarget)) {
newMissile.SetTarget(enemyToTarget.gameObject);
} else {
Debug.LogWarning("No enemy for newly spawned missile to target!");
}

// NOTE: The above is optional,
// since 'YourMissile' sets a new target from EnemyCache
// if the target is null; (checks per update)

// But I included it here in case you want it to filter
// what kind of enemy it needs to target on start :)
}
}

关于c# - 可以在 Unity3D 中创建更高效​​的寻的导弹系统吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57841393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com