我试图让一个对象在不同 x 轴上的两个向量之间生成,但它不起作用。 这是脚本:
...
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
public class OrbSpawner : MonoBehaviour
{
public GameObject orb;
private Vector3 minimum;
private Vector3 maximum;
private Transform trans;
public float timeofspawning;
public float spawnrate;
private void Awake()
{
InvokeRepeating("Spawner", timeofspawning, spawnrate);
minimum = new Vector3(-2, 6, 0);
maximum = new Vector3(2, 6, 0);
}
void Update()
{
float x = Random.Range(minimum.x, maximum.x);
float y = Random.Range(minimum.y, maximum.y);
float z = Random.Range(minimum.z, maximum.z);
trans.position = new Vector3(x, y, z);
}
public void Spawner()
{
Instantiate(this.orb, trans.position, Quaternion.identity);
}
}
对象只是不产卵。我将产卵时间和产卵率更改为 0f,仍然没有。问题可能与 trans.position 有关,但我不知道如何解决。如果有人可以提供帮助,请提前致谢!
确保“orb”是预制件,随机位置工作正常(虽然有点未优化)。 要制作预制件,请将对象从层次结构拖到资产中。 您还在计算每帧的生成位置,这比在必要时计算它的成本更高。 我不确定是什么导致它没有生成(我认为这是一个资产问题而不是代码问题)
这是我制作的飞扬的小鸟原型产卵管理器脚本的一些代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class SpawnManager : MonoBehaviour
{
[SerializeField] private GameObject pipePrefab;
[SerializeField] private float spawnRate;
[SerializeField] private float spawnPosX;
//Create a custom struct and apply [Serializable] attribute to it
[Serializable]
public struct Range
{
public float min;
public float max;
}
[SerializeField] private Range YRange;
// Start is called before the first frame update
void Start()
{
InvokeRepeating("SpawnRandomPipe", 2, spawnRate);
}
private void SpawnRandomPipe()
{
float spawnPosY = 0;
spawnPosY = UnityEngine.Random.Range(YRange.min, YRange.max);
Vector3 spawnPos = new Vector3(spawnPosX, spawnPosY, 0);
Quaternion spawnRotation = new Quaternion(0, 0, 0, 0);
Instantiate(pipePrefab, spawnPos, spawnRotation);
}
}
你有没有在场景中查看它是否在屏幕外生成?
这是 Instantiate 的 Unity 文档: https://docs.unity3d.com/ScriptReference/Object.Instantiate.html
为了获得更快的答案,我建议使用谷歌搜索
如果您为此目的创建了
trans
对象,则无需在更新中更改它。在spawn之前确定位置就足够了,可以降低代码的复杂度,提高处理速度。此外,如果您希望随机位置是这两个向量之间的一条线,请使用Vector3.Lerp
。否则,你的公式是正确的。
public void Spawner()
{
Instantiate(this.orb, Vector3.Lerp(minimum, maximum, Random.value), Quaternion.identity);
}