unity3d 如何得到两个向量之间的随机位置?

uyhoqukh  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(164)

我尝试在不同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);
    }
}

这个对象就是不产卵。我把产卵时间和产卵率都改成了0 f,但是还是没有。这个问题可能是trans.position的问题,但是我不知道怎么解决。如果有人能帮忙,提前谢谢你!

3pmvbmvn

3pmvbmvn1#

如果您创建trans对象就是为了这个目的,那么就没有必要在更新中更改它。在派生之前确定位置就足够了,这样可以降低代码的复杂性并提高处理速度。另外,如果您希望随机位置是这两个向量之间的一条线,请使用Vector3.Lerp。否则,您的公式是正确的。

public void Spawner()
{
    Instantiate(this.orb, Vector3.Lerp(minimum, maximum, Random.value), Quaternion.identity);
}
wztqucjr

wztqucjr2#

确保“orb”是一个预制件,随机位置工作正常(虽然未优化)。**要制作预制件,请将对象从层次结构拖到资产。您还需要计算每帧的产卵位置,这比必要时计算它的成本更高。 我不确定是什么原因导致它无法产卵(我认为这是资产问题,而不是代码问题)。
以下是我制作的flappy bird原型产卵管理器脚本的一些代码

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);
    }
}

你有没有在场景中查看它是否在屏幕外产卵?
以下是Unity的示例化文档:https://docs.unity3d.com/ScriptReference/Object.Instantiate.html

相关问题