【发布时间】:2021-11-05 15:23:05
【问题描述】:
所以我正在制作一个 2D 平台游戏,我想在整个地图上生成敌人,但不在摄像机范围内。 不得不说我是用 Cinemachine 来跟随玩家的。
这是我的生成器脚本:
*public class MobSpawner : MonoBehaviour
{
public GameObject Mob;
float randX;
Vector2 whereToSpawn;
public float spawnRate = 2f;
float nextSpawn = 0.0f;
public GameObject Camera;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Time.time > nextSpawn)
{
nextSpawn = Time.time + spawnRate;
randX = Random.Range(-36f, 62);
whereToSpawn = new Vector2(randX, transform.position.y);
Instantiate(Mob, whereToSpawn, Quaternion.identity);
}
}
}*
如你所见,我拿了 2 点,在它们之间我产生了敌人。由于这个范围基本上是整个地图,因此相机将始终在其中。
我希望敌人不会在摄像机内部生成,而是在摄像机外部生成。我怎样才能做到这一点?
【问题讨论】:
-
也许使用一个碰撞器将相机视图封装在一个特殊的碰撞矩阵上来检查敌人的生成位置是否与它碰撞?
-
您可以使用 GeometryUtility CalculateFrustumPlanes 和 TestPlanesAABB 对相机平截头体进行测试。或者你可以做一个 WorldToScreenPoint 确保 x 和 y 不在 Rect(0, 0, Screen.width, Screen.height) 中。您可以将生成代码放在首先测试随机位置的 while 循环中,如果正常则生成,否则再次循环。
-
我会找到不属于观察光谱的角度。一旦你有一个在观察范围之外的方向向量,为长度和生成添加一些标量。这样您就不需要循环或不断尝试寻找有效位置。你只会知道它是有效的。起点可以是
thisdoc。
标签: c# unity3d game-physics spawn