如何实例化两个向量之间的随机位置-Unity2D

问题描述 投票:0回答:2

我试图让一个对象在不同 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 有关,但我不知道如何解决。如果有人可以提供帮助,请提前致谢!

c# unity3d
2个回答
0
投票

确保“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

为了获得更快的答案,我建议使用谷歌搜索


0
投票

如果您为此目的创建了

trans
对象,则无需在更新中更改它。在spawn之前确定位置就足够了,可以降低代码的复杂度,提高处理速度。此外,如果您希望随机位置是这两个向量之间的一条线,请使用
Vector3.Lerp
。否则,你的公式是正确的。

public void Spawner()
{
    Instantiate(this.orb, Vector3.Lerp(minimum, maximum, Random.value), Quaternion.identity);
}
© www.soinside.com 2019 - 2024. All rights reserved.