简介
简单介绍一下unity3D,它是由Unity Techologies开发的一款游戏开发引擎,也是目前手机游戏和虚拟仿真领域最活跃、最易用的开发工具。近年来随着移动平台扩张的东风,Unity几乎成为了整个游戏以及虚拟仿真领域的行业标准。
其编辑器运行在Windows 和Mac OS X下,可发布游戏至Windows、Mac、Wii、iPhone、WebGL(需要HTML5)、Windows phone 8和Android平台。也可以利用Unity web player插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Mac 所支持。
(如国名手游王者荣耀就是采用unity开发)
设计思路
基于Unity3D和C#脚本开发的一款FPS射击类游戏。大概剧情就是玩家可以利用手中的散弹枪击杀暴走的机器人,且需要在规定的时间内在地图内寻找到“真实的钥匙”,如果时间耗尽或者被机器人击杀则游戏失败。
(随便弄的初始界面好吧我知道很丑)
逻辑流程图:
游戏主要功能描述:
界面部分:主要为登陆游戏界面制作。
地形部分:主要为人物模型以及游戏场景地形
粒子特效火焰粒子特效、爆炸粒子特效
音效:开枪音效、背景音乐、爆炸音效
动作控制:玩家的前进后退左转右转子弹发射
主要过程
Unity3D与Xml的交互
单机小游不需要数据库,通过自定义一个Xml储存数据。以登录界面的设计为例:
这是一个名为UserInfo的内容
<?xml version=”1.0”encoding=”UTF-8”standalone=”no”?>
上面的Xml有两层,父节点叫users,子节点有两个,分别为user1和user2,每个节点有两个属性,姓名和密码。每个节点有一段文字内容,要求能够读取每个节点的名称内容和属性,并且能够添加节点和属性。
这是一个操作Xml读取的类,默认继承Object,这个类里面主要有三个函数
Load(string filePath):通过文件路径来加载Xml的文件内容
LoadXml(string xmlFile):通过加载Xml文件内的文本内容加载Xml。
GetRootNode():用来获取Xml的根节点,有了这个根节点,就可以访问每一个子节点。
代码如下:
using System;
using System.IO;
using System.Xml;//添加命名空间
publc class ReadXmlFile
{
XmlDocument xmlDocument;
Public ReadXmlFilet()
{
xmlDocument = new XmlDocunment();
}
///
///通过文件路径导入Xml文件,用于单机版
///
Public bool Laod(string filePath)
{
xmlDocument.Load(filePath);
return true;
}
///
///通过加载XML文本内容加载Xml,用于网页版
///
Public bool LoadXml(string xmlFile)
{
xmlDocument.LoadXml(xmlFile);
return true;
}
//获取根节点
Public XmlElement GetRootNode()
}
Return xmlDocument.DocumentElement;
}
建立一个UI界面,如图为一个简单的登陆界面
(我知道界面很丑!重要的是学习方法!)
将Xml文件加载进来的代码如下:
readXmIFile=new ReadXmlFile();
//发布为EXE访问本地Xml的时候使用这种加载方式,这种方式发布网页不支持。
readXmlFile.Load(Application.dataPath+”/Data/Xml/UserInf
开始登陆验证,首先判断是否存在这个用户,如果存在获取这个Xml节点,将节点密码这个属性与用户输入的属性进行比较,相同则登陆成功,否则失败。
部分代码如下
Void OnGUI()
{
GUI.matrix=Matrix4x4.TRS(Vector3.zero,Quaternion.identity,new Vector3(GUIR.wscale,GUIRoot.hscale,I));
windowRect = GUI.WindowRect,DoMyWindow,””);
)
Void DoMy Window(int windoeID)
{
GUI.Label(new Rect(100,5,100,50),”登录验证”,labeIStyle);
GUI.Label(new Rect(40,65,60,40),”用户名”,labeIStyle);
name=GUI.TextField(new Rect(105,75,100,20),name,15);
GUI.Label(new Rect(40,130,60,60),”密码”,labeIStyle);
pwd=GUI.TextField(new Rect(105,145,100,20),pwd,15);
if(GUI.Button(new Rect(100,200,100,40)”Login”))
{
}
}
粒子特效实现
射的火焰,滚滚的浓烟、萤火虫、雨、雾或者你可以想到的其他任何效果,这些效果通常称为粒子效果(particle effect)这里主要讲述的是枪支射击火焰效果的实现。
首先导入枪支模型,为了增加真实性。在枪口位置设置一个子物体,其子物体展示粒子效果(GameObject——ParticleSystem)其粒子效果充当火焰特效。
游戏粒子效果如图所示:
动画的运用
基本知识
动画是预制的可视动作集,在2D游戏中,这涉及具有多福顺序的图像,并且可以非常快的翻转他们,结果就是对象看似在移动。这种效果类型于老式的翻转书,3D世界里的动画有很大的差别。在3D游戏中,使用模型来表示游戏实体,不能简单地在模型只见切换,以提供运动的幻觉。
Animation运用
射击及换子弹动画的实现,首先在Unity Asset Store中下载所需的模型并导入,动画通常是作为模型的一部分出现的,Animations选项卡中包含管理内置的动画所需的所有属性和控制选项。
将动画拖到Animation组件的Animations属性上,把它们应用于模型,这样使动画可供模型使用,但是不会实际的创建模型的动画,在多个动画间的切换通过脚本完成,C#脚本如下:
void Start ()
{
aui = this.GetComponent
A = Q.GetComponent
}
void Update ()
{
if (!A.IsPlaying ("Gun02Reload"))
{
if (Input.GetMouseButtonDown (0)&&IsAttck==true )
{
Zcount++;//计算子弹个数
if (Zcount==5) {
A.Play("Gun02Reload");
Zcount = 0;
} else {
A.Play("Gun02Shoot");
}//判断播放动画
IsAttck = false;//禁止开枪
Invoke ("OnAttck", 1.2f);//通过延迟12S允许开枪
aui.clip = G;
aui.Play();//播放开枪音效
L.transform.gameObject.SetActive(true );//火焰粒子效果开启
Invoke ("OFFL", 0.1f);//通过0.1S延迟关闭粒子效果
GameObject xx = Instantiate(XX);//“克隆”子弹预制件
xx.transform.position = came .transform.position;//为“克隆”的子弹赋予初始位置
xx.GetComponent
//为子弹添加方向与力
Destroy(xx,2f);//两秒后自动销毁子弹
}
}
}
void OFFL(){
L.transform.gameObject.SetActive(false);
}
void OnAttck(){
IsAttck = true;
}
触碰效果的应用
首先我们要制作一个玩家需要去收集的物体,从Assert store下载并导入一3D模型。如图导入的一个书本模型:
然后为了让它能够和玩家物体发生交互,我们将为它添加一个原型碰撞器。点击菜单Component——Physice——Box Collider 因为我们不希望玩家在收集它的时候突然撞上去然后停止运动,所以我们将它的碰撞器设置为触发模式,在组件中勾起Is Trigger。
部分C#脚本如下:
void OnTriggerEnter(Collider col)//Player触发事件
{
if (col.transform.tag == "DIR")//假如触发对象的tag为“DIR”(敌人)
{
f -= 0.1f;//每攻击一次减少0.1
S.value = f;
if (f<= 0)//血量小于等于0
{
this.transform .gameObject .SetActive (false );//关闭玩家本身
TT.fontSize = 60;//
TT.text = "你输了!!!";
Time.timeScale = 0;//暂停游戏所有运行
}
}
if (col.transform.tag =="B1")//当触发对象的tag为“B1”
{
tis.transform.gameObject.SetActive(true);
tis.text = "一页残卷";
Invoke("ZanT",1);//通过1S延迟关闭UI的TXT显示
aui.clip = ZHH;
aui.Play();
}
if (col.transform.tag == "B2")//当触发对象的tag为B2”“
{
G1++;
tis.transform.gameObject.SetActive(true);
tis.text = "真实钥匙";
Invoke("ZanT", 1);//通过1S延迟关闭UI的TXT显示
aui.clip = ZHH;
aui.Play();
}
}
void ZanT()
{
tis.transform.gameObject.SetActive(false );
}
(游戏运行的截图)
用户评论
终于有人说我这种零基础的想要做游戏的愿望可以实现啦!
有15位网友表示赞同!
Unity3D是不是很强大啊,连零基础都能玩转吗?
有14位网友表示赞同!
我一直想学习游戏制作,这篇文章好像太适合我了!
有7位网友表示赞同!
好期待自己也能用Unity3D创造出自己的游戏
有16位网友表示赞同!
做游戏的梦想终于可以启航啦!
有9位网友表示赞同!
以前一直觉得做游戏很遥不可及,现在看来只要学会Unity3D就OK了.
有8位网友表示赞同!
零基础就能做游戏? 这篇文章给我带来了无限可能!
有8位网友表示赞同!
看这个标题我直接跃跃欲试了!
有7位网友表示赞同!
终于有人来帮我完成我的游戏梦了!
有7位网友表示赞同!
学习Unity3D应该很有意思吧? 等我去看看教程...
有20位网友表示赞同!
我一直觉得Unity3D很棒,现在更是这样认为啦!
有11位网友表示赞同!
想要做一款独特的创意游戏,那就选用Unity3D吧!
有20位网友表示赞同!
这个标题让我充满了好奇心,要去找找看这篇文章的内容...
有10位网友表示赞同!
零基础的你也可以成为一名游戏的制作人!
有12位网友表示赞同!
Unity3D真是一つの神奇的工具啊!
有16位网友表示赞同!
以后我可以亲手制作我喜欢的游戏类型了!
有7位网友表示赞同!
做游戏不再是一件遥不可及的事情!
有13位网友表示赞同!
学习Unity3D是我的目标之一,等我去看看这篇文章介绍了什么。
有13位网友表示赞同!
现在看来做游戏的难度降低了很多!
有10位网友表示赞同!
这款软件能让我创作出属于自己的世界!
有7位网友表示赞同!