unity随机方向的代码_unity3d随机地牢生成代码

本文介绍了如何使用Unity3D实现随机地牢生成,包括地牢元素的枚举定义、二维数组转换为实体的过程,以及如何通过创建单例类`creat_dungeon`实例化地牢元素。代码示例展示了如何生成地板、墙壁和柱子,同时提供了地图类`map`的初始化和生成逻辑。文章还提供了一个简单的地牢生成控制类`gameDriver`,并分享了工程源码链接。
摘要由CSDN通过智能技术生成

做完了以后我又想了一下,发现其实根本不需要这么麻烦,果然demo里的代码对我的思路影响还是有点大。demo里的c++代码为了展示地牢的墙壁,在二维数组中加上了wall这个东西表示墙壁。事实上用unity来做的话,只需要考虑地板的位置,然后根据邻接的地板有没有东西来判断是否生成墙壁即可。

首先用一个枚举类型代表地牢迷宫中的各个元素:

public enumTile

{

Default,

DirtFloor,//房间地板

Wall_w,//上方的墙

Wall_s,//下方的墙

Wall_a,//左方的墙

Wall_d,//右方的墙

Corridor_ad,//横向走廊

Corridor_ws,//纵向走廊

Door,//房门

UpStairs,//入口

DownStairs//出口

}

然后考虑使用二维数组来保存地牢元素的信息。既然是用unity来做,先不考虑随机地牢的逻辑数组要怎么生成,先把二维数组转化为实体的方法写出来:

建立一个test脚本,用于测试生成用的creat_dungeon方法是否好用,并在里面定义一个测试用的二维数组:

usingUnityEngine;usingSystem.Collections;usingSystem;public classtest : MonoBehaviour {voidStart () {

Action _Instantiate=(t,v)=>{Instantiate(t,v,t.rotation);};//这里考虑不当,理论上不应该在test脚本中写Instantiate方法,而是应该在creat_dungeon中用。不过既然写出来了也能显示我懂一些委托的知识...将错就错好了

Tile[,] _map=new Tile[4,4];

_map [0, 1] =Tile.Wall_s;

_map [0, 2] =Tile.Wall_s;

_map [1, 1] =Tile.DirtFloor;

_map [1, 2] =Tile.DirtFloor;

_map [2, 1] =Tile.DirtFloor;

_map [2, 2] =Tile.DirtFloor;

_map [3, 1] =Tile.Corridor_ws;

_map [3, 2] =Tile.Wall_w;

_map [1, 3] =Tile.Corridor_ad;

_map [2, 3] =Tile.Wall_d;

_map [1, 0] =Tile.Corridor_ad;

_map [2, 0] = Tile.Wall_a;//自定义一个地图

creat_dungeon.Instance.creat (_map,_Instantiate);//调用生成函数

}

接下去就是考虑怎么写creat_dungeon这个类了,首先这个类只用于生成实体,所以不应该存在多份,所以设计成单例:

public classcreat_dungeon{private staticcreat_dungeon _instance;privatecreat_dungeon(){}public staticcreat_dungeon Instance{get{if (_instance == null)

{

_instance= newcreat_dungeon ();

}return_instance;

}

}

}

然后这个类中肯定需要动态加载预设的资源,这里用resources.load方法加载,在初始化函数中加上加载资源的代码:

privateTransform floor,pillar,wall_ws,wall_ad;privatecreat_dungeon(){

floor= Resources.Load ("Floor_1_Prefab",typeof (Transform)) asTransform;

pillar= Resources.Load ("Pillar_1_Prefab",typeof (Transform))asTransform;

wall_ws= Resources.Load ("Wall_w", typeof(Transform))asTransform;

wall_ad= Resources.Load ("Wall_a", typeof(Transform))asTransform;

}

然后根据资源模型的大小,定义一个常量:

private float floor_length=1.518111f;<

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值