[unity] unity学习——滚球游戏
来源:互联网 发布:php代码编写 编辑:程序博客网 时间:2024/05/22 11:55
一、学习内容
滚球游戏是这样的,一个四面有墙的场景,里面有球和小方块,控制球去吃方块,吃完方块就游戏结束。
通过制作滚球游戏进一步熟悉unity的操作以及游戏元素的设计。
二、游戏制作过程
1、创建3D工程——Roll a Ball
2、保存游戏场景
file——save scence,保存游戏场景,保存在工程目录的_scence目录中,命名为minigame3、创建底板、小球元素
在Hierarchy视图中创建Plane元素作为底板,命名为Ground。
大小和规模选择reset的默认属性就行。
在Hierarchy视图中创建Sphere元素作为小球,命名为Player,同样reset,再把position的Y设为0.5,这样整个球正好在底板上面。
为小球添加Rigidbody组件,质量mass设为1,勾选重力作用use Gravity。
4、为地板着色
在project视图新建一个Material文件夹,并在里面创建一个material元素,命名为background,选择颜色为深色
拖动background到Ground地板上进行染色。
5、移动小球
为Player添加脚本组件new script,命名为PlayeControler。先添加三个内容:
小球移动速度speed , Rigidbody加载Rigidbody组件, 获取输入控制移动input
using UnityEngine;using System.Collections;public class PlayerController : MonoBehaviour { public float speed; private Rigidbody rb; void Start () { rb = GetComponent<Rigidbody>(); } void FixedUpdate () { float moveHorizontal = Input.GetAxis ("Horizontal"); float moveVertical = Input.GetAxis ("Vertical"); Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical); rb.AddForce (movement * speed); }}其中上一篇已经用过的Input.GetAxis获取位移量,参数为“Horizontal”为横向,参数为“Vertical”为纵向。
与物理特性相关的操作应该放在函数FixedUpdate中,而不是Update中,Update多用于处理用户输入。
上一篇也已经用过,AddForce移动小球。
在组件属性面板中修改speed的值,运行游戏就可以控制小球移动了。
6、摄像机控制
小知识:将main Camera移动到player下面,摄像机就好跟随小球移动。
上一篇也学会用标准的unity脚本来控制摄像机跟随游戏元素。
这里,我们自己写脚本控制摄像机移动,对main Camera添加C#脚本元素:
using UnityEngine;using System.Collections;public class CameraControler : MonoBehaviour { public GameObject player; private Vector3 offset; void Start() { offset = transform.position - player.transform.position; } void LateUpdate() { transform.position = player.transform.position + offset; }}
7、添加围墙
GameObject菜单栏中,选择Create Empty ,命名为Walls
再创建一个Cube元素,命名为West Wall,将West Wall拖放到Walls中,作为Walls的子元素。
通过Edit菜单的Duplicate或快捷键 Ctrl+D复制出三个West Wall元素,并命名为East Wall、South Wall、North Wall,改变其大小位置,正好放在地板的四面。这里我贴出我的四面墙的transform面板
至此完成围墙元素。运行游戏会发现小球只能在围墙内活动了。
8、添加——被采集的小方块
Hierarchy中添加Cube元素,命名为Pick Up,调整期transform属性,让其悬空立起来。transform面板为
然后,为pick Up添加c#脚本元素,命名为Rotator,让其自动自转起来,
using UnityEngine;using System.Collections;public class Rotator : MonoBehaviour { void Update() { transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime); }}
其中transform.Rotate是实现自转的函数,完成后运行游戏发现小方块已经能自动旋转。
因为要使用很多的Pick Up方块,所以在project面板中创建一个文件夹prefabs,把Pick Up拖进prefebs文件夹中,方便以后对所有Pick Up元素进行统一操作。
然后再Hierarchy视图中创建Empty元素,命名为Pick Ups,把Pick Up拖进Pick Ups中,同样Ctrl+D复制Pick Ups元素,总共12个Pick Up元素。然后水平移动这些元素形成一个好看的图案,我这里随意摆了个圆形。
接下来为Pick Up进行染色,和第四步一样,project视图中添加Materia元素,命名为Pick Up,然后选择金黄色(或者你觉得好看的颜色)
然后把Pick Up的Materia元素拖到Prefabs的Pick Up中,这也就是上面红色字体的目的,这样统一为所有pick Up元素进行染色。
至此完成所有采集块的制作。
9、实现小块采集
小球的运动实现了,采集块也制作完成了,下面是当小球碰撞到采集块的时候,采集块消失。
这一部分是在小球的脚本中完成,前面已经建立了PlayerControler脚本,编辑这个脚本,添加碰撞函数(这里用的是OnTriggerEnter函数),
void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag ("Pick Up")) { other.gameObject.SetActive (false); } }
函数就是当碰撞的元素的Tag是Pick Up时,让这个元素的状态设为false。这个Tag需要进行设置,点击project视图中的Prefabs文件夹下的Pick Up,它的Inspector视图中会有Tag属性,点击add tag,添加Pick Up,并将Tag设为Pick Up即可。
这时运行游戏发现采集块碰撞了不能消失,不急~上图中Inspector视图的Box Collider有个Is Trigger勾选项,将其勾选。再运行游戏,发现一家可以实现小块的采集了。
10、显示分数,及游戏结束
每采集一个元素,就积一分。元素采集完,游戏结束,显示you win!编辑PlayerControler,添加count元素进行计分。
在Hierarchy视图中添加UI——Text,命名为Count Text,发现视图中多了Canvas,新建的text就在这个目录下。
text的Inspector面板中,有个color选择字体颜色,这里我设为白色。Rect Transform修改text的位置。
同样的方式创建一个Text元素,命名WinText,用来显示游戏获胜时的提示。
接下来就是修改PlayerControler脚本,使分数显示在count text上,脚本要添加using UnityEngine.UI;才能使用text组件。
在脚本中创建Text对象:Public Text CountText;
Public Text WinText;
并在Start函数中进行初始化,每积一分时,CountText内容改变,count大于12时,游戏结束,WinText显示You Win!
PlayerControler的完整代码如下:
using UnityEngine;using UnityEngine.UI;using System.Collections;public class PlayerControler : MonoBehaviour { private Rigidbody rb; private int count; public float speed; public Text countText; public Text winText; void Start() { rb = GetComponent<Rigidbody>(); count = 0; SetCountText(); winText.text = ""; } void FixedUpdate() { float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = Input.GetAxis("Vertical"); Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); rb.AddForce(movement *speed); } void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("Pick Up")) { other.gameObject.SetActive(false); count++; SetCountText(); } } void SetCountText() { countText.text = "Count: " + count.ToString(); if (count >= 12) winText.text = "You Win!"; }}
为了方便CountText的显示,写SetCountText方便调用CountText对象。
至此游戏制作结束,积分、获胜显示都有了。
11、导出游戏
file菜单栏的Build Setting选项,把minigame那个scence拖到Scenes In Build,根据你的环境选择平台,直接build即可。
三、总结
这个游戏的制作继续对简单的物体运动进行练习,以及上色练习,摄像机的控制,同样式元素的统一操作,元素直接的碰撞处理,text的初使用。
源码在我的GitHub里:https://github.com/congshenV/RollABall.git
0 0
- [unity] unity学习——滚球游戏
- [unity] unity学习——弹球游戏
- Unity学习笔记——Unity基础一:unity界面、场景、游戏物体、组件等基本概念
- Unity学习过程(一)——认识Unity游戏引擎
- Unity游戏开发——unity接入多渠道sdk
- unity学习之游戏商城
- Unity——简单游戏示例1
- Unity应用——游戏双视图
- unity日常——游戏存档
- unity日常——游戏优化
- Unity开发—简单的RPG游戏
- Unity—UGUI游戏摇杆的制作
- 【Unity 3D】学习笔记三十:游戏元素——游戏地形
- 【Unity 3D】学习笔记三十二:游戏元素——游戏光源
- Unity官方第一个人称射击游戏<恶魔射手>—学习笔记四(游戏中的管理)
- Unity学习——使用手册
- Unity学习笔记—入门
- Unity Shader学习6 —— Unity创建一个Shader
- C++/Cli 中Linq 的替代实现, 不干净
- iOS 友盟分享 <小白集成>
- java多线程--公平锁(一)
- C++的构造函数和析构函数
- ReportViewer 類別
- [unity] unity学习——滚球游戏
- 关于HTA
- XML文件读写方法
- 使用TextInputLayout创建一个登陆界面
- vb.net第一课(第2小节)导入命名空间
- extjs baseCombo 通过后台查询数据赋值到下拉列表
- myeclipse误删代码,或者svn代码更新出错,又无法版本恢复情况下
- Android初识BLE4.0
- iOS开发学习路线和规划