马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册帐号
x
本文为跑酷教程的第二期,第一期传送门如下:
炫酷跑酷教程(1)——简单的动态地图生成与人物动作
地图多样化 在开始本篇教程之前,我们得先讨论我们的跑酷游戏中还需要什么样的地形,来丰富我们的地图,完成地图多样化。那赶紧请出我的小伙伴给出创意?。?/font> 伙伴A:地图来个像斜坡的功能,能上能下,能右斜,左斜的那种。 伙伴B:总是在安全的地面跑太没有挑战了,加上镂空的地图多刺激。 目标地图 由以上需求分析出我们新的地形生成: 地形1:上升地形 地形2:下降地形 地形3:左斜地形 地形4:右斜地形 地形5:陷阱地图 地型实现 地形1-4生成比较简单,只要在引导物体更换坐标时,改变下一次的相应方向的值就行。我们在GameMode.cs文件中新声明地形的生成函数。 [AppleScript] 纯文本查看 复制代码 public void BuidUpTerrain() //生成上升地形
{
var tmpRoad = Instantiate(roadTemplate, guideTrs.position, guideTrs.rotation);
PlayRoadAnimator(tmpRoad);
roads.Add(tmpRoad);
guideTrs.position += guideTrs.forward;
guideTrs.position += guideTrs.up * 0.1f;
}
但是地形地图需要连续一段才能看出效果,我们就设定任何一种地形都是至少由10个道路组成,值得注意的是,我们现在的地图生成逻辑是踩过一个道路才会在生成下一个,如果这样的话,我们生成地形地图的时候就得注意道路生成的数量,否则就会造成游戏生成物体的数量成指数级的增长,然后内存就爆掉了,这是血的教训啊,一定要谨记。于是我们新加了限制条件,并做了如下更改: [AppleScript] 纯文本查看 复制代码 public bool isBuidDirRoad; //是否生成方向道路
int dirRoadType; //方向道路的类型
int dirRoadNumber; //方向道路的数量
public void BuidRoad() //生成道路的方法
{
if (isBuidDirRoad && dirRoadNumber > 0)
{
switch (dirRoadType) //通过道路的类型来进行生成
{
case 1:
BuidUpTerrain();
dirRoadNumber--;
break;
case 2:
BuidDownTerrain();
dirRoadNumber--;
break;
case 3:
BuidLeftTerrain();
dirRoadNumber--;
break;
case 4:
BuidRightTerrain();
dirRoadNumber--;
break;
}[/font][/color][/align][align=left][color=rgb(26, 26, 26)][font=-apple-system, BlinkMacSystemFont,]
if (dirRoadNumber <= 0)
{
isBuidDirRoad = false;
}
}
这样就完成了我们的目标,限制了生成道路的数量。 地形5:陷阱地图生成虽然较为简单,只需要改变一下道路模板的自身旋转,但是有3种模式,如下: 一:相对于道路的右边 二:相对于道路居中 三:相对于道路右边 知道了这几种模式,我们就可以在代码中进行实现,如下: [AppleScript] 纯文本查看 复制代码 public void BuidTrapRoad()
{
guideTrs.position += guideTrs.forward;
var tmpRoad = Instantiate(roadTemplate, guideTrs.position, guideTrs.rotation);
var tmpController = tmpRoad.GetComponent<RoadController>();
tmpController.ChangeRoadType();
tmpRoad.transform.Rotate(Vector3.up,90);
int trapType = Random.Range(1,4); //用于确定陷阱的相对位置--1左边,2居中,3右边!
switch (trapType)
{
case 1:
tmpRoad.transform.position += tmpRoad.transform.forward;
break;
case 2: //居中类型不做操作
break;
case 3:
tmpRoad.transform.position -= tmpRoad.transform.forward;
break;
}
guideTrs.position += guideTrs.forward * 2.0f;
PlayRoadAnimator(tmpRoad);
roads.Add(tmpRoad);
}
而且由于我们现在的旋转函数是绕父物体的Fowrd轴旋转的,改变父物体旋转后,需要重新确定绕什么轴进行旋转。我们需要在RoadChildrenChange.cs文件中在写一个旋转函数。如下: [AppleScript] 纯文本查看 复制代码 transform.RotateAround(parentObj.transform.position, parentObj.transform.right, 30 * Time.deltaTime);
金币 没有金币这个道具,跑酷游戏的色彩都会减少一半。在生成金币的时候我们会发现,我们金币生成的位置总是固定在道路的上方,每一个格子对应一个金币的生成位,那么按照这样的逻辑,我们可以在道路生成完成后在进行金币的生成,于是在RoadChildrenChange.cs中写出我们的金币生成函数: [AppleScript] 纯文本查看 复制代码 private void Start()
{
gold = Resources.Load("Gold") as GameObject; //读取文件金币的预制体
bool isCreat = Random.Range(1, 10) == 3 ? true : false; //是否生成金币
if (isCreat)
{
Vector3 tmpPos = transform.position;
gold = Instantiate(gold, tmpPos += transform.up * 1.2f, Quaternion.identity);
gold.transform.SetParent(transform);
nowQuat = gold.transform.rotation; //保存当前金币的旋转,方便初始化。
}
}
[AppleScript] 纯文本查看 复制代码 gold.transform.Rotate(Vector3.up,70*Time.deltaTime);
完成后: UI 跑酷游戏的UI不需要太多,我们这个工程暂时只做一个显示当前金币数的UI就足够了。首先,我们新建一个Canvas,在Canvas下面新建一个Text的UI。打开2D视图进行物体的位置改变。如图: 完成创建以后,我们新建一个Goldcollision.cs文件,用来完成吃金币的效果,代码如下: [AppleScript] 纯文本查看 复制代码 private void OnTriggerExit(Collider other)
{
var player = other.gameObject.GetComponent<PlayerController>();
if (player)
{
gameMode.goldNumber++;
Destroy(gameObject);
}
}
接着将脚本挂载在金币物体当中,并勾选触发器按钮,并保存。
同时我们在GameMode文件进行UI文本的更新: [AppleScript] 纯文本查看 复制代码 using UnityEngine.UI; //引入UI
private void Update()
{
numberText.text ="当前金币数:"+ goldNumber.ToString();
}
场景装饰 完成以上工作后,我发现之前的场景太low了,完全不符合我们的的游戏主题,于是替换掉我们场景的天空盒子,更换道路材质,运行游戏: 是不是顿时觉得高大上了许多呢?天空盒子与道路材质都可以在Unity的商店进行下载,导入后进行替换即可,这里就不在过多阐述了。 知乎@繁华如梦
|