我试图在固定的Z轴和随机的X轴点之间生成敌人。我把地面变成了玩家的一个子节点,这样它就可以和玩家一起移动。玩家只能在水平轴上移动。我想让它看起来像敌人总是在玩家前面产生。我怎样才能做到这一点?现在如果我和玩家一起移动地面,敌人只会在指定的点上产卵。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpawnManager : MonoBehaviour
{
[SerializeField] private GameObject _enemy;
// Start is called before the first frame update
void Start()
{
StartCoroutine(SpawnRoutine());
}
// Update is called once per frame
void Update()
{
}
IEnumerator SpawnRoutine()
{
while(true)
{
Vector3 PosToSpawn = new Vector3(Random.Range(-23.6f, 23.6f),1, 16.6f);
Instantiate(_enemy, PosToSpawn, Quaternion.identity);
yield return new WaitForSeconds(1f);
}
}
}
新答案
使用与你对敌方对象的引用相同的方法获得对地面对象的引用。
[SerializeField]
private GameObject _ground;
替换为:
Vector3 PosToSpawn = new Vector3(Random.Range(-23.6f, 23.6f),1, 16.6f);
替换为:
Vector3 PosToSpawn = new Vector3(Random.Range(_ground.transform.position.x - 23.6f, _ground.transform.position.x + 23.6f), 1, 16.6f);
只要你如你所说的那样更新地面对象相对于玩家对象的位置,这就可以了。
旧的答案(在示例脚本被修改后改变了)。
如果我对你的问题理解正确的话 你的敌人每次运行游戏时都在同一个地方产生 即使你使用Random.Range来设置他们的X值。
如果这是你的实际问题,那么这是因为你的游戏总是使用同一个种子来生成随机数。
你可以在每次开始游戏时使用一个任意的值,比如System.DateTime.Now.Ticks,来生成一个新的随机种子。 把下面的代码放到你的Start方法中(不是你的Update方法)。
int seed = (int) System.DateTime.Now.Ticks;
Random.InitState(seed);
上述代码的作用是获取当前的系统时间ticks(每次运行游戏时都会改变),然后用该值作为种子初始化随机数生成器。 这应该会导致你每次运行游戏时的产卵位置不同。
更多信息请看。