unity随机在周围生成敌人
在下图区域中的随机点位生成敌人
首先获取玩家位置以及设置最大和最小距离,然后根据这些参数生成l1, l2, r1,r2四个点,把红色区域分成四个区域,每个区域各有0.25的几率在其中取点。代码如下
public Vector3 GetRandomPosition()
{
Vector3 spawnPoint;
float spawnArea = Random.Range(0f, 1f);
Vector3 leftPoint1 = new Vector3(playerTran.position.x + minSize, playerTran.position.y + minSize, playerTran.position.z);
Vector3 leftPoint2 = new Vector3(playerTran.position.x + maxSize, playerTran.position.y + maxSize, playerTran.position.z);
Vector3 rightPoint1 = new Vector3(playerTran.position.x - minSize, playerTran.position.y - minSize, playerTran.position.z);
Vector3 rightPoint2 = new Vector3(playerTran.position.x - maxSize, playerTran.position.y - maxSize, playerTran.position.z);
if (spawnArea > 0.75f)
{
spawnPoint = new Vector3(Random.Range(leftPoint1.x, leftPoint2.x), Random.Range(rightPoint1.y, leftPoint2.y), playerTran.position.z);
}
else if (spawnArea > 0.5f)
{
spawnPoint = new Vector3(Random.Range(rightPoint2.x, leftPoint1.x), Random.Range(leftPoint1.y, leftPoint2.y), playerTran.position.z);
}
else if (spawnArea > 0.25f)
{
spawnPoint = new Vector3(Random.Range(rightPoint2.x, rightPoint1.x), Random.Range(rightPoint2.y, leftPoint1.y), playerTran.position.z);
}
else
{
spawnPoint = new Vector3(Random.Range(rightPoint1.x, leftPoint2.x), Random.Range(rightPoint1.y, rightPoint2.y), playerTran.position.z);
}
return spawnPoint;
}
生成敌人的完整脚本
using JetBrains.Annotations;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemySpawner : MonoBehaviour
{
public Transform playerTran;
public GameObject enemyToSpawn;
public float spawnWaitTime = 1f;
private float spawnCounter;
public float maxSize;
public float minSize;
// Start is called before the first frame update
void Start()
{
spawnCounter = spawnWaitTime;
}
// Update is called once per frame
void Update()
{
spawnCounter -= Time.deltaTime;
if (spawnCounter <= 0)
{
Debug.Log("生成怪物");
spawnCounter = spawnWaitTime;
Instantiate(enemyToSpawn, GetRandomPosition(), transform.rotation);
}
}
public Vector3 GetRandomPosition()
{
Vector3 spawnPoint;
float spawnArea = Random.Range(0f, 1f);
Vector3 leftPoint1 = new Vector3(playerTran.position.x + minSize, playerTran.position.y + minSize, playerTran.position.z);
Vector3 leftPoint2 = new Vector3(playerTran.position.x + maxSize, playerTran.position.y + maxSize, playerTran.position.z);
Vector3 rightPoint1 = new Vector3(playerTran.position.x - minSize, playerTran.position.y - minSize, playerTran.position.z);
Vector3 rightPoint2 = new Vector3(playerTran.position.x - maxSize, playerTran.position.y - maxSize, playerTran.position.z);
if (spawnArea > 0.75f)
{
spawnPoint = new Vector3(Random.Range(leftPoint1.x, leftPoint2.x), Random.Range(rightPoint1.y, leftPoint2.y), playerTran.position.z);
}
else if (spawnArea > 0.5f)
{
spawnPoint = new Vector3(Random.Range(rightPoint2.x, leftPoint1.x), Random.Range(leftPoint1.y, leftPoint2.y), playerTran.position.z);
}
else if (spawnArea > 0.25f)
{
spawnPoint = new Vector3(Random.Range(rightPoint2.x, rightPoint1.x), Random.Range(rightPoint2.y, leftPoint1.y), playerTran.position.z);
}
else
{
spawnPoint = new Vector3(Random.Range(rightPoint1.x, leftPoint2.x), Random.Range(rightPoint1.y, rightPoint2.y), playerTran.position.z);
}
return spawnPoint;
}
}