原转载自 https://blog.csdn.net/sun15980/article/details/51093048 ,已失效

新 【Unity3D开发小游戏】Unity3D零基础一步一步教你制作跑酷类游戏_恬静的小魔龙-CSDN博客

Demo源码及对应素材下载:码云: Game_Parkour: Unity开发跑酷游戏

游戏简要说明
游戏类型:跑酷类游戏(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,方便在面板上修改。
错误修改:感谢 jewis123 朋友提出的,这里漏了jumpHeight与m_jumpState的定义,前者代表最大高度,后者代表当前是向上跳跃,还是从高处落下,详细可查看源码
接下来,在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<Transform> bornPosList = new List<Transform>();// 道路列表public List<Transform> roadList = new List<Transform>();// 抵达点列表public List<Transform> arrivePosList = new List<Transform>();// 障碍物列表public List<GameObject> objPrefabList = new List<GameObject>();// 目前的障碍物Dictionary<string, List<GameObject>> objDict = new Dictionary<string, List<GameObject>>();// 道路间隔距离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<GameObject> objList = new List<GameObject>();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);}}

【Unity3D实战】零基础一步一步教你制作跑酷类游戏相关推荐

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

    在两个月前曾写了一篇<[Unity3D实战]零基础一步一步教你制作跑酷类游戏(1)>,里面一步一步演示了制作跑酷类游戏,然而由于时间原因,只写到了让角色往前移动为止.这个坑一直没有时间去填 ...

  2. 零基础也能学会的——用Python制作超级玛丽小游戏

    ** 1.游戏的入口 作者的功力还是蛮深的,整个代码的框架很清晰.看一下它的启动函数: 第一个from 引入了setup和tools, 主要是把一些初始化的工作在setup里面全部做完,读取一些配置文 ...

  3. 成为Google认证机器学习工程师,零基础只需要2步?

    滴滴出行今年 3 月在硅谷成立实验室,专门研究以机器学习为核心的"自动驾驶"技术:Google.Uber 在自动驾驶.机器学习等领域内进行激烈的人才争夺:工信部也曾透露,中国人工智 ...

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

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

  5. 零基础也能快速上手的动画制作工具 | 万彩动画大师

    大多数人认为制作高质量的动画视频是很困难的,事实上,不一定是这样.找到一款好的软件,零基础也能轻松制作精美的动画视频.那么,福利来了!这4款快速制作动画的软件推荐给你,快来看看吧! 万彩动画大师免费制 ...

  6. 从开发零基础到登上Steam和Oculus:一个VR游戏开发者的自述

    原文:From zero game dev experience to publishing a VR game on Steam & Oculus Home - what I learned ...

  7. 零基础学python图文版-教到你会为止的Python入门课程即将开班

    原标题:教到你会为止的Python入门课程即将开班 [嫌长不看版] 1. " 码上行动"是我们编程教室制作的 Python 基础课程,完全零基础也可以学 2. 课程包括 视频.讲义 ...

  8. 零基础学习PPT(如何使用PTT制作海报)

    快速复制PPT界面 Ctrl + m 选中一张 ,按下回车键 移动PPT界面 点击右下方的浏览视图,就可以很方便的移动PPT 删除PPT界面 假设你想删除第二张到第八张,那么你就可以选中第二张按住sh ...

  9. 新手零基础学习Python第一步,搭建开发环境!

    如何在电脑上面搭建Python开发环境?本文会解答这个问题. Python是一门计算机编程语言,通过给计算机下达精确的指令以完成相应的任务或者事情. 人类掌握Python后,就可以利用这个工具告诉计算 ...

最新文章

  1. 驱动操作硬件的根本操作
  2. 源哥每日一题第十七弹 poj 1568 Alpha-Beta剪枝
  3. python动态柱状图_python – 在Jupyter中使用plotly以离线模式创建动画图表
  4. 多项式输出pascal程序
  5. Entity Data Model (EDM) 深入分析, Part 3
  6. bind配置文件解析
  7. python color属性_Python中类的属性、方法及内置方法
  8. webgl 包围盒子
  9. Vijos 1041题:神风堂人数
  10. MSP430的AD7705驱动程序
  11. 计算机键盘上的2个定位键,电脑键盘上Tab 键的神奇之处!(用途详解)
  12. 萤火虫小巷2(看完了)
  13. 网络广告投放基础,广告
  14. ObjectARX反应器概述
  15. 2019保研回顾——西电计科到北理工计科
  16. 视频号小白如何做出一个赚钱的视频号?
  17. 【Dos】常见的Dos攻击
  18. linux下使用第三方商店安装应用
  19. react-native系列(13)动画篇:Animated动画库和LayoutAnimation布局动画详解
  20. 85款中国风字体!超级好看的古风系列

热门文章

  1. Delphi FMX Drag Drop
  2. 目标跟踪VOT2016 BenchMark评价标准介绍
  3. mysql 最大连接池数_mysql 最大连接数 连接池
  4. u大师u盘装系统win7_如何使用u盘装系统
  5. python excel创建kml文件
  6. mysql隔离级别详解
  7. 中小企业OA系统的设计与实现
  8. 抖音四面被拒,再战头条终获offer,全套教学资料
  9. 手把手教你用canvas画动态直线
  10. dplayer弹幕服务器php,修复官方Dplayer-Typecho插件不能连接弹幕API后端的方法