在两个月前曾写了一篇《【Unity3D实战】零基础一步一步教你制作跑酷类游戏(1)》,里面一步一步演示了制作跑酷类游戏,然而由于时间原因,只写到了让角色往前移动为止。这个坑一直没有时间去填,(虽然也没多少人看啦),今天刚好有时间完成了一个跑酷类游戏的Demo。放上来给有兴趣的朋友看看。

Demo源码及对应素材下载:链接:http://pan.baidu.com/s/1i4QkkuD 密码:p04w

游戏简要说明

游戏类型:跑酷类游戏(Demo,非完整游戏)

操作方式:左右方向键(可自己移植到手机端)

游戏要素:

1.游戏角色会自动向前跑,玩家可通过左右方向键让其左右移动

2.游戏中存在障碍物,玩家需避开这些障碍物,否则会因为被障碍物阻挡的原因无法前进

3.当游戏角色因为被阻挡而消失在视野中时,视为失败

4.当游戏角色因为被阻挡而处于偏后方时,会提高移动速度直到回到原本所处的屏幕位置

游戏场景搭建

使用准备好的素材(路面、人物、障碍物),将这些素材制作成Prefab,然后根据自己喜好搭建好场景。如下图:

游戏脚本编写

游戏角色控制器moveController:

新建一个C#文件,命名为moveController,然后将其打开。

由于角色需要向前、左、右三个方向移动,所以我们需要有其在前进方向上的速度与左右方向上的速度,分别命名为:moveVSpeed、moveHSpeed,

同时由于玩家在落后的情况下需要加速,所以我们声明两个变量:前进方向上的最小移动速度minVSpeed与前进方向上的最大移动速度maxVSpeed。

于是我们可以得到以下脚本:

// 前进移动速度

float moveVSpeed;

// 水平移动速度

public float moveHSpeed = 5.0f;

// 最大速度

public float maxVSpeed = 10.0f;

// 最小速度

public float minVSpeed = 5.0f;其中moveHSpeed、maxVSpeed、minVSpeed声明为public,方便在面板上修改。

接下来,在Start()函数中定义moveVSpeed的初始值:

moveVSpeed = minVSpeed;

在Update()中使人物能移动起来:

float h = Input.GetAxis("Horizontal");

Vector3 vSpeed = new Vector3(this.transform.forward.x, this.transform.forward.y, this.transform.forward.z) * moveVSpeed ;

Vector3 hSpeed = new Vector3(this.transform.right.x, this.transform.right.y, this.transform.right.z) * moveHSpeed * h;

Vector3 jumpSpeed = new Vector3(this.transform.up.x, this.transform.up.y, this.transform.up.z) * jumpHeight * m_jumpState;

this.transform.position += (vSpeed + hSpeed + jumpSpeed) * Time.deltaTime;保存一下cs文件,切换到Unity,将该脚本挂载在角色对象的身上,保留默认值或手动设置:

运行游戏,看看是否能成功跑起来,并且能通过左右键控制人物左右移动。

看着人物越跑越远越跑越远,最后消失在远方......诶!教练,这和说好的不一样啊!人物咋不见了?

咳咳,这是因为我们没有让摄像机跟随它的原因,接下来,我们让摄像机与人物一起移动~

打开刚才的C#文件,声明一个public的变量

// 摄像机位置

public Transform cameraTransform;

在Update()函数中,添加以下代码:

// 设置摄像机移动速度

Vector3 vCameraSpeed = new Vector3(this.transform.forward.x, this.transform.forward.y, this.transform.forward.z) * minVSpeed;

// 让摄像机跑起来

cameraTransform.position += (vCameraSpeed) * Time.deltaTime;

注意到没,这里我们所定义的摄像机的移动速度与人物移动速度有点差别:

1.摄像机没有左右移动

2.摄像机的速度恒定为minVSpeed,也就是我们所定义的人物的最小移动速度(当然这个时候人物也一直是以这个速度在移动)

转到Unity,查看人物身上的Move Controller组件,现在这里应该多了一个变量等你设置:

我们将摄像机拖动到camera Transform处,再运行游戏。这时候你应该能看到人物在不断往前走,但在屏幕上的位置是没有变化的,因为摄像机一起移动了。

人物走着走着 哎呀 前面怎么没路了?别急,让我们来让路无限延长起来~

首先我们将道路的GameObject复制几个,我这里是总共有3个道路的GameObject,分别命名为Road1,Road2,Road3

然后在每一个Road下,添加一个Cube,将Cube的Mesh Renderer关闭,并将其Box Collider的Is Trigger勾上。命名为ArrivePos。(我才不会告诉你们这一步应该在上一行之前做呢!)

将多条道路拼好,连成一条笔直的公路。

然后新建一个空物体,命名为GameManager,为其新建C#Script  GameManager.cs,然后打开该脚本。

声明一下多个变量:(注意引用命名空间using System.Collections.Generic;

// 生成障碍物点列表

public List bornPosList = new List();

// 道路列表

public List roadList = new List();

// 抵达点列表

public List arrivePosList = new List();

// 障碍物列表

public List objPrefabList = new List();

// 目前的障碍物

Dictionary> objDict = new Dictionary>();

// 道路间隔距离

public int roadDistance;并定义函数:// 切出新的道路

public void changeRoad(Transform arrivePos)

{

int index = arrivePosList.IndexOf(arrivePos);

if(index >= 0)

{

int lastIndex = index - 1;

if (lastIndex < 0)

lastIndex = roadList.Count - 1;

// 移动道路

roadList[index].position = roadList[lastIndex].position + new Vector3(roadDistance, 0, 0);

initRoad(index);

}

else

{

Debug.LogError("arrivePos index is error");

return;

}

}

void initRoad(int index)

{

string roadName = roadList[index].name;

// 清空已有障碍物

foreach(GameObject obj in objDict[roadName])

{

Destroy(obj);

}

objDict[roadName].Clear();

// 添加障碍物

foreach(Transform pos in bornPosList[index])

{

GameObject prefab = objPrefabList[Random.Range(0, objPrefabList.Count)];

Vector3 eulerAngle = new Vector3(0, Random.Range(0, 360), 0);

GameObject obj = Instantiate(prefab, pos.position, Quaternion.EulerAngles(eulerAngle)) as GameObject;

obj.tag = "Obstacle";

objDict[roadName].Add(obj);

}

}

在Start()中:

void Start () {

foreach(Transform road in roadList)

{

List objList = new List();

objDict.Add(road.name, objList);

}

initRoad(0);

initRoad(1);

}然后打开之前的moveController.cs,声明变量:

// 游戏管理器

public GameManager gameManager;

定义函数:

void OnTriggerEnter(Collider other)

{

// 如果是抵达点

if (other.name.Equals("ArrivePos"))

{

gameManager.changeRoad(other.transform);

}

// 如果是透明墙

else if (other.tag.Equals("AlphaWall"))

{

// 没啥事情

}

// 如果是障碍物

else if(other.tag.Equals("Obstacle"))

{

}

} 呼,一大串代码,大家敲的累不累,什么!你是copy过去的?太过分了!我要拿刀子了!

嗯,切换回Unity中,点击GameManager这个物体,设置其GameManager组件的值:

这里的BornPos指的是障碍物出生点,以下图所示为每一条道路定义一个或多个出生点,每条路的出生点用一个BornPos的空物体进行管理:

然后将出生点按其所处道路的序号一一拖入(先设置size的值,3条就设置为3)

RoadList也是一样,将道路按序号一一拖入。

这里的ArrivePosList要注意一下,并不是直接按道路序号拖入,而是往后一位,即:

road2

road3

........

roadn

road1这样的顺序将其对应的ArrivePos拖入列表

然后将需要生成的障碍物的Prefab文件拖入ObjPrefabList

设置道路的间隔距离(即一条道路的中心点到接下来一条道路中心点的距离 distance = road1.length / 2 + road2.length / 2 大概这么计算)

到这一步为止,GameManager的设置基本完成。点击人物的GameObject,设置moveController,将GameManager的游戏对象拖入到指定位置:

对了,还有一步非常重要的设置:

为人物添加Collider与RightBody,为所有障碍物和路面添加Collider(注意不要勾上Is Trigger)

然后运行游戏。

呼,这时候没有问题的话应该是能看到有障碍物出现了,人物走到障碍物处会被挡住,并且道路会自动拼接移动,无止境的走下去、走下去、走下去。。。

这个Demo也基本进入尾声了,接下来,做最后的游戏失败判断和让角色赶回正常位置。

打开GameManager.cs,声明变量:

public bool isEnd = false;

打开moveController.cs 声明变量:

// 摄像机距离人物的距离

public float cameraDistance;

在Update()函数中 添加以下代码:

// 当人物与摄像机距离小于cameraDistance时 让其加速

if(this.transform.position.x - cameraTransform.position.x < cameraDistance)

{

moveVSpeed += 0.1f;

if (moveVSpeed > maxVSpeed)

{

moveVSpeed = maxVSpeed;

}

}

// 超过时 让摄像机赶上

else if(this.transform.position.x - cameraTransform.position.x > cameraDistance)

{

moveVSpeed = minVSpeed;

cameraTransform.position = new Vector3(this.transform.position.x - cameraDistance, cameraTransform.position.y, cameraTransform.position.z);

}

// 摄像机超过人物

if(cameraTransform.position.x - this.transform.position.x > 0.0001f)

{

Debug.Log("你输啦!!!!!!!!!!");

gameManager.isEnd = true;

}

定义OnGUI()函数:

void OnGUI()

{

if (gameManager.isEnd)

{

GUIStyle style = new GUIStyle();

style.alignment = TextAnchor.MiddleCenter;

style.fontSize = 40;

style.normal.textColor = Color.red;

GUI.Label(new Rect(Screen.width / 2 - 100, Screen.height / 2 - 50, 200, 100), "你输了~", style);

}

}

到这一步,Demo编写完成。(由于现在是凌晨4点 实在太疲惫,所以本篇基本都是直接贴代码,如果有朋友有什么问题的话 可以直接留言哈~)

原文:http://blog.csdn.net/sun15980/article/details/51093048

unity跑酷怎么添加金币_【Unity3D实战】零基础一步一步教你制作跑酷类游戏(填坑完整版)...相关推荐

  1. unity跑酷怎么添加金币_叫好不叫买?《跑酷老奶奶》游戏评测

    游戏简述: 游戏背景讲述的是一位名叫史密斯的老奶奶,她非常喜欢苹果,但是有一个配备滚轮装备的小偷正从她的果园里偷苹果!为了抓住小偷,她从果园追逐到城市,飞跃谷仓和办公室,务必在小偷得手之前,先获得苹果 ...

  2. unity跑酷怎么添加金币_超级酱跑酷:SUPER UNITYCHAN RUN修改金币方法

    在玩<超级酱跑酷:SUPER UNITYCHAN RUN>的时候,想必很多玩家因金币不够而导致自己做不了很多事情,在这里小编给各位玩家介绍几款好用的修改器,如:八门神器.葫芦侠.烧饼修改器 ...

  3. 【Unity3D实战】零基础一步一步教你制作跑酷类游戏

    原转载自 https://blog.csdn.net/sun15980/article/details/51093048 ,已失效 新 [Unity3D开发小游戏]Unity3D零基础一步一步教你制作 ...

  4. unity给头发添加物理_不需要写代码,直接在unity实现手机可以跑的毛发效果

    马上注册,加入CGJOY,让你轻松玩转CGJOY. 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 大家好,  我是炭窑居士, 好久不见 这次由我和好友fxyyoung一起给大家带来原创的毛发 ...

  5. 小强软件测试_小强老师零基础学习软件测试视频教程 理论篇+自动化篇+工具篇+实战等零基础课程...

    小强老师零基础学习软件测试视频教程 理论篇+自动化篇+工具篇+实战等零基础课程 1.jpg (53.32 KB, 下载次数: 0) 2017-10-5 09:33 上传 2.jpg (49.08 KB ...

  6. 如何解析lvx文档_建站零基础入门:手把手教你如何自助建站

    使用阿里云云服务器ECS搭建网站有多种方式,本文主要介绍自助建站的流程. 建站方式 使用ECS建站的方式如下表所示.请根据实际业务需求,选择适合您的建站方式. 自助建站步骤 1.选择服务器. 不同网站 ...

  7. 零基础学python实战-零基础学习python_类和对象(36-40课)

    今天我们开始学习面向对象的知识咯,之前我对面向对象也学的懵懵的,因为感觉知道好像又不是特别清楚,接下来我们一起来学习类和对象吧.零基础的课程我都是看小甲鱼的视频学的,没基础的可以去这个网址下载视频学习 ...

  8. 九宫怎么排列和使用_剪映零基础入门教程第三十七篇:一学就会系列之九宫格小程序配音...

    很多玩儿抖音的朋友都看过九宫格视频,但是并不是每个玩抖音的人都会制作这个九宫格视频,实际这个需要借助小工具来帮忙,而常用抖音的朋友们会对剪映更加熟悉一些,且九宫格视频在剪映内的制作方式则比较简单.那么 ...

  9. java无线电台RS制信号_中国MOOC_零基础学Java语言_第2周 判断_2信号报告

    2 信号报告(5分) 题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength)    信号强度即大小. 其中R位于报告第一 ...

最新文章

  1. 投票系统web服务器,创建一个Web投票系统
  2. 打通C/4HANA和S/4HANA的一个原型开发:智能服务创新案例
  3. shell中条件判断if中的-z到-d的意思
  4. OGC之路(1) 之 WMS标准学习总结
  5. 在Ubuntu|CentOS上安装Shutter截图工具及快捷键设置
  6. Gaze Estimation笔记——data normalization
  7. mysql 排序字段索引吗_Mysql 排序优化与索引使用(转)
  8. 中国糖和甜味剂市场趋势报告、技术动态创新及市场预测
  9. layui中laypage当前页刷新
  10. leetcode(105)从前序遍历和中序遍历构建二叉树
  11. Logback 深入分析
  12. 海康摄像机通过Ehome协议接入EasyCVR无法成功上线的原因排查及配置注意事项
  13. linux下拷贝某一时间段的文件
  14. Win10电脑如何清理系统垃圾
  15. 中级php工程师笔试,PHP工程师笔试题目及行测题型示例
  16. 给所有的Control加两个属性,实现回车键自动跳转到下一个控件
  17. 深入浅出自然语义处理原理并构建自然语义处理(NLP)模型GPT2
  18. java中根遍历后根遍历构造,恳求大佬指点!!!首先标明空子树的先根遍历序列建立一棵二叉树...
  19. 【中间件】RabbitMQ入门学习笔记
  20. conda 清除已经下载的缓冲包

热门文章

  1. 2018年NOIP普及组完善程序题2—右侧第一个更大值
  2. 学习笔记:CODESYS(顺序功能图SFC)
  3. Eclipse 从SVN检出项目之《文件夹 “” 已不存在 》
  4. 基于HTML旅游网站设计与实现 途游网站制作 学生DW静态旅游网页设计 html静态旅游风景区网页设计制作 web前端课程设计 web前端课程设计代码 web课程设计
  5. 沙拉翻译网页双语显示,程序员必备,是神器没错了
  6. 海关数据:外贸主动营销工具有哪些?
  7. 以地图视角回顾70年互联网发展
  8. 客户流失?来看看大厂如何基于spark+机器学习构建千万数据规模上的用户留存模型 ⛵
  9. c++打印心形_C语言控制台打印3D爱心图案
  10. 【2020秋招】提前批陌陌机器学习算法工程师面试经验