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