随即生成房间二

这篇博客介绍了如何使用Unity3D创建一个随机生成房间的系统。通过定义房间方向、房间预制体、颜色等参数,实现房间的位置变化和门的设置。系统会寻找最远的房间作为终点,并在最远房间中选择一个只有一扇门的房间作为最终目标。文章还包含了用于记录房间信息和更新房间状态的`door`类。整个过程涉及到2D物理检测、场景管理和游戏对象的实例化。
摘要由CSDN通过智能技术生成

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

public class creatRoom : MonoBehaviour
{
    public enum Direction {up,down,left,right};
    public Direction direction;


    [Header("房间信息")]
    public GameObject roomPrefabs;
    public int roomNomer;
    public Color statrCor, endCor;

    [Header("位置控制")]
    public Transform pointPos;
    public float yOffest;
    public float xOffest;
    public LayerMask layerMask;
    private GameObject endRoom;
    public List<door> rooms = new List<door>();
    [SerializeField]
    public List<GameObject> lastRoom = new List<GameObject>();
    public List<GameObject> lessRoom = new List<GameObject>();
    public List<GameObject> oneWayRoom = new List<GameObject>();

    public int maxstep;


    void Start()
    {
        for (int i = 0; i < roomNomer; i++) 
        {
           rooms.Add(Instantiate(roomPrefabs, pointPos.position, Quaternion.identity).GetComponent<door>());
            ChangeRoomPos();
            
        }
        rooms[0].gameObject.GetComponent<SpriteRenderer>().color = statrCor;
        endRoom = rooms[0].gameObject;

        //最远的房间 
        foreach (var room in rooms)
        {
            /* if (room.transform.position.sqrMagnitude > endRoom.transform.position.sqrMagnitude) 
             {
                 endRoom = room.gameObject;
             }*/
            setUpRoom(room, room.transform.position);
        }

        FindRoom();
        endRoom.GetComponent<SpriteRenderer>().color = endCor; 
    }

    
    void Update()
    {
        if (Input.anyKeyDown) 
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().name);
        }   
    }
    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(pointPos.position, 2f);
        
    }

    /// <summary>
    /// 随机生成房间位置
    /// </summary>
    public void ChangeRoomPos()
    {
        direction = (Direction)Random.Range(0, 4);

        do
        {
            switch (direction)
            {
                case Direction.up:
                    pointPos.position += new Vector3(0, yOffest, 0);
                    break;
                case Direction.down:
                    pointPos.position += new Vector3(0, -yOffest, 0);
                    break;
                case Direction.left:
                    pointPos.position += new Vector3(-xOffest, 0, 0);
                    break;
                case Direction.right:
                    pointPos.position += new Vector3(xOffest, 0, 0);
                    break;
            }
        } while (Physics2D.OverlapCircle(pointPos.position, 0.2f,layerMask));
        
     }

    /// <summary>
    /// 设置门
    /// </summary>
    /// <param name="newRoom">房间</param>
    /// <param name="roomPos">房间的位置</param>
    public void setUpRoom(door newRoom, Vector3 roomPos) 
    {
        newRoom.roomdown = Physics2D.OverlapCircle(roomPos + new Vector3(0, -yOffest, 0),0.2f, layerMask);
        newRoom.roomup = Physics2D.OverlapCircle(roomPos + new Vector3(0, yOffest, 0), 0.2f, layerMask);
        newRoom.roomleft = Physics2D.OverlapCircle(roomPos + new Vector3(-xOffest, 0, 0), 0.2f, layerMask);
        newRoom.roomright = Physics2D.OverlapCircle(roomPos + new Vector3(xOffest, 0, 0), 0.2f, layerMask);

        newRoom.updateRoom();
    }
    /// <summary>
    /// 找到最有房间作为最终的房间
    /// </summary>
    public void FindRoom() 
    {
        //找到最远的房间
        for (int i = 0; i < rooms.Count; i++)
        {
            if (rooms[i].stepTostart > maxstep)
                maxstep = rooms[i].stepTostart;
        }
        //将最远的房间放到列表
        foreach (var room in rooms)
        {
            if (room.stepTostart == maxstep) 
            {
                lastRoom.Add(room.gameObject);
            }
            if (room.stepTostart == maxstep - 1)
                lessRoom.Add(room.gameObject);
        }
        //在最远的房间里面找到只有一个门的房间
        for (int i = 0; i < lastRoom.Count; i++)
        {
            if (lastRoom[i].GetComponent<door>().DoorNumber == 1)
                oneWayRoom.Add(lastRoom[i]);
        }
        for (int i = 0; i < lessRoom.Count; i++)
        {
            if (lessRoom[i].GetComponent<door>().DoorNumber == 1)
                oneWayRoom.Add(lessRoom[i]);
        }
        //筛选特殊情况
        if (oneWayRoom.Count != 0)
        {
            endRoom = oneWayRoom[Random.Range(0, oneWayRoom.Count)];
        }
        else 
        {
            endRoom = lastRoom[Random.Range(0, lastRoom.Count)];
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class door : MonoBehaviour
{
        [Header("们")]
        public GameObject door_left;
        public GameObject door_right;
        public GameObject door_up;
        public GameObject door_down;
   
        [Header("们的状态")]
        public bool roomleft;
        public bool roomright;
        public bool roomup;
        public bool roomdown;

        public Text text;
        public int stepTostart;
    public int DoorNumber;
  
    void Start()
    {
        door_down.SetActive(roomdown);
        door_right.SetActive(roomright);
        door_left.SetActive(roomleft);
        door_up.SetActive(roomup);
    }

    /// <summary>
    /// 计算出房间距离初始房间的位置
    /// </summary>
    public void updateRoom() 
    {
        stepTostart = (int)Mathf.Abs(transform.position.x / 18 )+(int)Mathf.Abs(transform.position.y / 9);

        text.text = stepTostart.ToString();

        if (roomdown)
            DoorNumber++;
        if (roomleft)
            DoorNumber++;
        if (roomright)
            DoorNumber++;
        if (roomup)
            DoorNumber++;

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值