今天,又是充满希望的一天!

UnitySir - 00008-2_完善怪物随机(某个区域)生成

Posted on By Zj

需要实现功能

怪物将在特定的区域内进行 生成


知识点

Object.Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent)

克隆 original 对象并返回克隆对象。

Random.Range(float min, float max);

返回介于minmax 之间的随机浮点数(只读)

注意max包含在内。 Random.Range(0.0f,1.0f)可以返回1.0作为值

Random.Range分布是均匀的。 范围是一个随机数生成器。

Transform.TransformPoint(Vector3 position);

position 从本地空间变换到世界空间。

该方法会根据当前对象坐标缩放来转换

Quaternion.identity

单位旋转(只读)。

该四元数对应于“no rotation”- 对象与世界轴或父轴完全对齐。


完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MonsterGenerate : MonoBehaviour
{
    [Header("生成怪物的最大数量")] [SerializeField] private int monsterNumMax = 8;
    [Header("当前怪物的数量")] [SerializeField] private int monsterCurrNum = 0;

    [Header("加载出的怪物对象")] [SerializeField] private GameObject monsterPrefabObj;
    [Header("怪物列表")] [SerializeField] private List<GameObject> monsterList = new List<GameObject>();

    private void Start()
    {
        //加载怪物对象
        monsterPrefabObj = Resources.Load<GameObject>("Prefabs/Models/Monster1");
        //启用协程
        StartCoroutine(GenerateMonster());
    }

    /// <summary>
    /// 利用协程生成怪物
    /// </summary>
    /// <returns></returns>
    private IEnumerator GenerateMonster()
    {
        while (true)
        {
            if (monsterCurrNum < monsterNumMax)
            {
                //随机生成一个本地坐标
                var localPos = new Vector3(GetRndF(), GetRndF(), GetRndF());
                //将本地坐标转为世界坐标
                var pos = transform.TransformPoint(localPos);
                //获取随机的方向
                var rotation = Quaternion.Euler(0f, Random.Range(0f, 360f), 0f);
                //实例化一个怪物对象
                var monsterInstance = Instantiate(monsterPrefabObj, pos, rotation, null);

                monsterList.Add(monsterInstance);
                monsterCurrNum++;

                yield return new WaitForSeconds(5f); //每隔五秒
            }

            yield return null;
        }
    }

    /// <summary>
    /// 获取随机数
    /// </summary>
    /// <returns></returns>
    private float GetRndF()
    {
        return Random.Range(-0.5f, 0.5f);
    }
}

参考链接

Unity小问题:如何在一个选定的空间范围内随机生成物体


UnitySir (bilibili)

B站ID:UnitySir

如果内容对你有所帮助: