Unity3D技术
Unity3D技术(精选10篇)
Unity3D技术 第1篇
关键词:虚拟实现,Unity3D,产品虚拟展示,交互平台
1 背景分析
工业产品虚拟展示系统是在工业产品设计阶段,将各种不同产品设计软件(如3D S MAX、Pro/E、UG NX等)所产生的工业产品三维模型,通过数据转换成虚拟展示的场景主体模型,再通过模型识别和Lod高阶渲染等技术,实现工业产品三维模型的在线虚拟展示[1]。
对企业和电子商务来说,工业产品虚拟展示以三维的表现形式,能够全方位的展现一个物体,具有二维平面图象不可比拟的优势。企业将他们的产品发布成网上三维的形式,能够展现出产品外形的方方面面,并可以通过互动操作,演示产品的功能特性和使用操作,充分利用互联网高速迅捷的传播优势来推广公司的产品。尤其在网上电子商务方面,将销售产品做成在线三维的形式展示,顾客通过对之进行观察和操作能够对产品有更加全面的认识了解,决定购买的几率必将大幅增加,为销售者带来更多的利润[2]。
目前,网络产品虚拟展示技术正处在发展阶段,互联网上已经出现了不少虚拟系统,下面简要介绍国内外的应用于虚拟展示的Unity技术。
Unity3D是一个多平台的游戏开发工具,是一个全面整合的专业游戏引擎,具有更优越的效果和更高的扩展空间。Unity对DirectX和OpenGL拥有高度优化的图形渲染管道。Unity支持所有主要文件格式,并能和大部分相关应用程序协同工作。低端硬件亦可流畅运行广阔复杂的场景。Unity内置的NVIDIA、PhysX物理引擎带能够带来逼真的互动感觉,实时三维图形混合音频流、视频流。Unity提供了具有柔和阴影与烘焙lightmaps的高度完善的光影渲染系统。
Unity3D引擎具备开发过程技术要求高,高级渲染效果和用户定制支持远远高于其它的优势,非常适合产品虚拟展示在交互访问和逼真表现的需求。
2 基于Unity3D的虚拟展示系统
基于Unity3D的虚拟展示系统包括系统组织结构和系统工作流程两个方面。系统组织结构包括系统的模块划分,功能职责等;系统工作流程则是通过一个产品的展示,描述从3D模型的设计、制作、导入网站、后台添加信息等直到最终在网页上展示出来的全过程。
2.1 系统组织关系
整个虚拟展示系统大致可分为网页部分和Unity3D展示部分,其中网页系统负责用户在浏览器上的各种操作和管理,而Uni ty3D展示部分则是利用Unity3D引擎,开发一个接口统一的展示框架,实现工业产品的交互式虚拟展示。
2.1.1 网页系统
网页系统主要分为权限管理模块、3D模型文件管理模块、展示模块、企业管理模块、产品管理模块和新闻模块。网页系统中新闻模块与其它模块关系不大,主要功能是把管理员在后台更新的新闻内容展示在新闻区;权限管理模块主要负责各个用户的定位,目前用户主要分为管理员、企业用户、普通注册用户和游客四个用户组;3D模型管理模块负责管理企业用户和管理员上传的展示模型文件,安排这些文件的位置并可以根据其必要信息找到它们;展示模块和Unity3D展示框架对接,当用户通过浏览器浏览某个展示产品的时候,展示模块从3D模型管理模块获取相对应的模型文件路径并将其传达给Unity3D展示框架,这样Unity3D展示框架便会加载模型文件并将其展示给用户;企业管理模块用于维护企业用户的信息,包括企业名称、账号、简介等信息,以及管理新企业的进驻和退出,企业信息修改等;产品管理模块负责管理各个企业的产品信息,包括新增产品、下线产品、产品信息修改等,另外还包含产品展示模型的上传和修改,此模块会与3D模型管理模块协同完成相关功能。
2.1.2 Unity3D展示模块
Unity3D展示模块是用Unity3D引擎开发的一个能够实现动态加载和现实3D模型的Web Player应用。通过安装很小的Unity3D插件,实现在各个主流浏览器上运行这个Web Player应用来加载产品模型展示,例如Explorer,Firefox,Safari等。该展示模块能够通过用户交互按钮,控制灯光、声音、基础动作、自定义动作和摄像机等,动态加载任意模型资源并予以展示的一个展示框架。
将模型放在Unity3D中展示,首先要借助于工业设计格式转换插件完成模型的最后处理。在格式转换插件中,用户可以添加对模型的各种描述信息,包括模型基本信息和动作信息。模型基本信息包括公司名称,公司网址,展示产品尺寸和自定义信息,其中自定义信息的数量限制为20个,所有模型基本信息可以跟随工业产品模型一起发布到网络,用户在浏览工业产品模型的时候,能够同时获得模型的基本信息;动作信息部分包括从3DS MAX等导出的动作信息,这里的动作信息是广义的动作,不仅包括了模型动画,还包括更改颜色,显示/隐藏物体等“动作”。
用户交互浏览动作主要可以通过两种方式:点击按钮浏览动作和点击模型浏览动作。交互式浏览展示能够带来更好的产品展示效果[3]。
点击按钮浏览动作的方式是最简单的浏览方式。在Unity3D格式转换插件中制作也比较方便,只要在该动作对应的栏目输入该动作的动作名并设置相应的动作示意图片即可。用户浏览的时候,可在展示窗口下方看见带有动作示意图片和动作名称的按钮,用户点击该按钮,展示模型即可做出响应的动作。
点击模型浏览动作的方式是最直观的浏览方式。制作时,先要在Unity的Scene场景中选择一个物体,在该物体上设置碰撞体,这样在浏览窗口中,点击该设置后的物体,浏览窗口就会产生一个事件。在Unity3D格式转换插件中,将该物体添加到响应的动作栏目中,即可把该物体和响应的动作对应起来,这样,在浏览窗口中,点击该物体,就可以做出响应的动作。
在使用Unity3D格式转换插件设置模型的基本信息和动作信息之后,就可以进行模型导出。Unity3D格式转换插件可以导出展示程序所专用的asset格式。在导出的过程中,除了做导出模型文件,模型基本信息,模型动作信息等操作之外,还会进行压缩处理。由于工业产品展示是通过发布到网络上进行展示,因此使用具有高压缩比的压缩算法显得尤为重要[4]。Unity3D格式转换插件使用的压缩算法是LZMA(Lempe1-Ziv-Markov chain-Algorithm的缩写),LZMA算法是2001年以来得到发展的一个数据压缩算法,它用于7-Zip归档工具中的7z格式。它类似于LZ77的字典编码机制,在一般的情况下压缩率比bzip2为高,用于压缩的字典档案大小可达4GB,7z格式具有比常见的RAR格式更高的压缩比。一般来说,Unity3D格式转换插件使用LZMA算法,可以将一个15M左右大小的模型文件转换为2M以内,完全可以满足网络传输的要求。
2.2 系统工作流程
产品展示系统工作首先要制作展示模型,把要展示的产品制作成数字化的虚拟展品,然后就可以通过网页系统和展示模块呈现给用户了。整体流程如图1所示。
2.2.1 模型的创建
模型的创建可以使用3DS MAX也可以使用Maya等其他主流3D设计软件,也可以使用Pro/E,UGNX等专门的工业设计软件建模,然后转换为Unity3D展示模块可识别的文件。创建模型不是本文阐述的重点,在这里不再详述。其中自定义动作是通过模型的特定位置传感而播放模型文件中的指定动作,比如打开车门,电子设备拆分成零件等。这些动作是在制作3D模型过程中实现的,没有任何局限,这样就能够达到更好的交互效果,从而提升展示效果。
2.2.2 上传到网页系统
将建好的模型文件上传到网站,需要指定的企业用户或者管理员身份实施。上传同时添加此展品的文字信息描述。这样,其它用户在浏览这个展示产品时,网页系统会将此展品的模型文件以参数形式传给Unity3D展示模块。
2.2.3 用户浏览及交互
Unity3D展示模块展示时,用户通过展示模块的界面控制基础动作,获取全方的浏览观赏,并通过交互性高级动作更深入的了解展示产品的信息
2.3 实验结果
从展示效果来看,该系统可以高度再现展品的三维信息,方便的交互设计更容易让人有身临其境的感觉。如图2所示是一款工业产品实物与展示效果的对比。
该产品的虚拟展示经过优化和调整,即使是在实时渲染3D场景的情况下,系统对CPU、显卡、内存等系统资源的占用都可保持在较低的水平稳定工作。
3 结语
Unity3D技术建立的产品物体模型文件小,3D真实交互、跨平台运用,能够完整地呈现企业产品的外型及功能。利用Unity3D技术以视觉的方式呈现不同的事件和功能的互动性。Unity3D引擎的特性使得它能支持更大的场景,更多的展示物件,更炫的展示效果。
随着互联网电子商务的发展,以及客户对产品选择的要求提高。促使制造业企业为客户提供一个从不同角度浏览产品,交互地对产品细部进行展示,全面了解新产品的产品虚拟展示系统,Unity3D工业产品展示系统能够满足新时代工业产品展示的需求,对产品的开发和市场适应力具有重要作用,将会成为未来虚拟展示的主要技术手段之一。
参考文献
[1]曾建超,俞志和.虚拟现实的技术及其应用.清华大学出版社,1996.3.
[2]李乐山.工业设计心理学.高等教育出版社,2004.1.
[3]王金龙.三维网格模型压缩算法研究.西安电子科技大学.2008.12.
Unity3D编写雷电游戏 第2篇
一、搭建游戏的框架。
一般的游戏都可以分为四个场景:
1.开始界面
2.游戏场景
3.暂停界面
4.结束界面
开始界面,就是存放开始菜单的地方了,游戏场景就是游戏的主场景,游戏的主要元素都在这边体现,暂停和结束画面我就不多说了。更多的还有在开始和主游戏场景之间加入过场动画等等。当然你也可以在暂停界面中插入广告
我们会发现这几个场景之间其实就是切换来切换去的关系。如果知道设计模式中的State模式,就会发现跟这个很象。可以通过State模式来实现这几个场景的分离,然后分边为他们添加不同的元素。
想要挂接在Unity3D中的结点的脚本都得继承MonoBehaviour,State就是所有的状态的父类了,主要是三个函数,Init()用于这个状态的初始化,Update用于场景的更新,Exit()用于当离开当前状态时所进行的一些操作,比如隐藏当前界面等。
创建一个空的Object用来挂接我们游戏的主脚本,代码如下:
using UnityEngine;using System.Collections;public class Main_Script : MonoBehaviour { public State m_CurState;public void ChangeState(State newState){ m_CurState.Exit();m_CurState = newState;m_CurState.Init();} // Use this for initialization void Start(){ m_CurState.Init();} // Update is called once per frame void Update()
{ m_CurState.Update();} } 这样我们就可以轻松的在不同的状态中切换了。想要增加一个新的状态,就只需继承State类,然后在其中写这个状态所要的元素,在适当的地方ChangeState一下就好了。
脚本的层次结构如下: 例如我在按钮按下时切换到开始场景:
using System.Collections;public class BeginGame : MonoBehaviour { public StateRun m_RunState;public Main_Script m_MainScript;// Use this for initialization void Start(){ } // Update is called once per frame void Update(){ } void OnMouseEnter(){ print(“enter”);} void OnMouseUp(){ m_MainScript.ChangeState(m_RunState);} void OnMouseExit(){ print(“exit”);} } 这个脚本是挂在一个板上面的,点击它时就进入游戏的主场景了。下回说一下飞机的移动。
现在开始真正的游戏元素的编写了。
第一步,让飞机动起来。
首先是飞机的前进,通常2D中的做就是背景的循环滚动。
在3D中我们可以让摄像机移动,背景我们可以做超一个大地形。在地形上摆一些固定的东西。
// Update is called once per frame void Update(){ TurnLeft = false;TurnRight = false;if(Input.GetKey(KeyCode.W)){
Vector3 screenPos = Camera.mainCamera.WorldToScreenPoint(this.transform.position);//print(screenPos.y);if(Screen.height > screenPos.y)this.transform.Translate(Vector3.forward * Time.deltaTime * m_nMoveSpeed);} if(Input.GetKey(KeyCode.S)){ Vector3 screenPos = Camera.mainCamera.WorldToScreenPoint(this.transform.position);if(0 < screenPos.y)this.transform.Translate(Vector3.forward * Time.deltaTime *-m_nMoveSpeed);} if(Input.GetKey(KeyCode.A)){ Vector3 screenPos = Camera.mainCamera.WorldToScreenPoint(this.transform.position);if(0 < screenPos.x)this.transform.Translate(Vector3.left * Time.deltaTime * m_nMoveSpeed);//向左转
if(CurRotation < RotateLimit){ print(CurRotation);CurRotation += RotateSpeed;} TurnLeft = true;} if(Input.GetKey(KeyCode.D)){ Vector3 screenPos = Camera.mainCamera.WorldToScreenPoint(this.transform.position);if(Screen.width > screenPos.x)this.transform.Translate(Vector3.left * Time.deltaTime *-m_nMoveSpeed);//向右转
if(CurRotation >-RotateLimit)CurRotation-= RotateSpeed;TurnRight = true;} //回归
if(!TurnLeft !TurnRight){ if(CurRotation > 0.0)CurRotation-=RotateSpeed;else if(CurRotation < 0)CurRotation +=RotateSpeed;} Quaternion rot = Quaternion.AngleAxis(CurRotation, new Vector3(0, 0, 1));m_Plane.rotation = rot;
//让相机和飞机一起以一定的速度前移
this.transform.Translate(Vector3.forward * Time.deltaTime * m_nMoveSpeed);Camera.mainCamera.transform.Translate(Vector3.up * Time.deltaTime * m_nMoveSpeed);} 飞机的主要控制代码。不知为什么,我的两个角度限制没有效果。郁闷。有空还看一下。
这次先加入子弹的发射吧,没用模型,先用的一个capsule的prefab代替吧。
一想到各种武器之间的随意切换,就不由的想到了设计模式中的Strategy模式。
有关策略模式的详细介绍可以通过百度和维基来学习。
这个模式其实和State模式差不多。
Weapon类是所有武器的基类,新的武器继承于它,设置发射点,子弹模型,然后实现Fire函数就可以了。
WeaponManager用于管理所有武器,切换武器。
using UnityEngine;using System.Collections;public class WeaponManager : MonoBehaviour { public Weapon m_CurWeapon;private float m_FireElapseTime = 0;
// Use this for initialization void Start(){ } // Update is called once per frame void Update(){ m_FireElapseTime += Time.deltaTime;if(Input.GetKey(KeyCode.Space)){ if(m_FireElapseTime > m_CurWeapon.GetBulletInterval()){ m_CurWeapon.Fire();m_FireElapseTime = 0;} else { } } } } 记录子弹发射后的时间,然后在大于时间间隔后才能发射下一个子弹。
武器父类:
using UnityEngine;using System.Collections;using System;public class Weapon : MonoBehaviour { //子弹时间间隔
protected float m_fBulletInterval = 0;//子弹类型
public String m_typeName =“";public float GetBulletInterval(){ return m_fBulletInterval;} // Use this for initialization void Start(){ } // Update is called once per frame void Update(){ } public virtual void Fire(){ } } 最基本的一种子弹:
using UnityEngine;using System.Collections;public class WeaponNormal : Weapon { private const int MAX_FP = 2;public Transform[] m_FirePoint = new Transform[MAX_FP];public Rigidbody m_BulletPre;WeaponNormal(){ m_fBulletInterval = 2;m_typeName = ”Normal“;} // Use this for initialization void Start(){ } // Update is called once per frame void Update(){ } public override void Fire(){ for(int i = 0;i < MAX_FP;i++){ Rigidbody clone =(Rigidbody)Instantiate(m_BulletPre, m_FirePoint[i].position, m_FirePoint[i].rotation);clone.velocity = transform.TransformDirection(Vector3.forward * 20);} } } m_FirePoint是一个数组,存储了发射子弹的位置。在编辑器中,可以在飞机周围用空的GameObject放置一系列炮口的位置,然后拖入这个数组中。MAX_FP定义了炮口的数量。这里边用到了速度属性,这个是rigidbody才有的,所以在设置子弹的prefab时一定要为它加上rigidbody才行。结构如下图所示:
最后的效果图:
现在子弹出来了,但是我们没有加上子弹的消亡,这样子弹被创建出来后就一直存在于场景中不会消失,会越积越多,所以我们让子弹在移出屏幕时就把他销毁掉。
using UnityEngine;using System.Collections;public class BulletControl : MonoBehaviour { // Use this for initialization void Start(){ } // Update is called once per frame void Update(){
Vector3 screenPos = Camera.mainCamera.WorldToScreenPoint(this.transform.position);//print(screenPos.y);if(Screen.height < screenPos.y)Destroy(transform.gameObject);} } 将这个脚本挂接在子弹的prefab上就可以实现效果了。
己方的飞机控制已经初步完成了,现在要加入敌机了。
理论上应该有两种方式:
1.预先设定,就是在编辑器里在你想要的位置上加上敌方的攻击单位
2.动态生成,根据游戏进行的时间来控制敌方攻击单位的产生。
这边采用第2个方式来产生,有一些地面单位倒是可以用第一种方式来产生。
我们首先要设置一个敌机的产生位置,用空的object可以随意的定一个坐标。
using UnityEngine;using System.Collections;public class EnemyManager : MonoBehaviour { public GameObject m_EnemyPre;public Transform m_CreatePoint;//一波飞机的数量
public const int MAX_GROUP_ENEMYS = 4;//两波飞机之间的时间间隔
public float GROUP_INTERVAL = 2.0f;//同一波中两架飞机之间产生的间隔
public float CREATE_INTERVAL = 0.25f;private float m_fTimeAfterOneGroup = 0.0f;private float m_fTimeAfterCreate = 0.0f;private int m_nEnemyNum = 0;// Use this for initialization void Start()
{ } // Update is called once per frame void Update()
{ m_fTimeAfterOneGroup +=Time.deltaTime;m_fTimeAfterCreate += Time.deltaTime;if(m_fTimeAfterOneGroup > 2.0f){ if(m_fTimeAfterCreate > 0.25f){ GameObject clone =(GameObject)Instantiate(m_EnemyPre, m_CreatePoint.position, m_CreatePoint.rotation);clone.AddComponent(”MoveScript_Shake“);m_nEnemyNum +=1;m_fTimeAfterCreate = 0;} if(m_nEnemyNum == MAX_GROUP_ENEMYS){ m_fTimeAfterOneGroup = 0.0f;m_nEnemyNum = 0;} } } } 敌机的移动脚本,可自己再定义新的移动脚本,在创建新敌机时挂上去就好:
using UnityEngine;using System.Collections;public class MoveScript_Shake : MonoBehaviour { //标志左右移动方向
private int m_nDir = 1;//原始位置
private Vector3 m_OriginalPos;//水平移动速度
public float m_HoriSpeed = 0.1f;//翻转速度
public float m_RotSpeed = 1.0f;//向前移动速度
public float m_MoveSpeed = 0.0005f;public Vector3 curScreenPos;public Vector3 LDPoint;// Use this for initialization void Start()
{ m_OriginalPos = transform.position;LDPoint = GameObject.Find(”LDPoint“).transform.position;print(LDPoint);} // Update is called once per frame void Update()
{ float relativeOffset = transform.position.x10){ Destroy(this.gameObject);} // print(”Cur:"+transform.position);// if(transform.position.z < LDPoint.z)// { // Destroy(this.gameObject);// } } } 实现效果:
原来那个用Unity3D自带的火焰老改不出想要的效果,去看了一个教程,调出一个还好的感觉。
最后的效果是:
Unity3D技术 第3篇
关键词:Unity3D;Andoird;游戏开发
一、引言
Unity3D是由Unity Technologies开发的一个让开发者创建三维游戏、建筑可视化、实时三维动画等类型互动内容的跨平台的游戏开发工具,是一个整合度很高的专业游戏引擎。Unity可运行在Windows 和Mac OS X下,可发布游戏至Windows、Mac、Wii、iPhone和Android平台,支持Mac 和Windows的网页浏览。由于Unity3D的跨平台和易用性等特性被越来越多的游戏开发公司所重视,并逐渐成为3D游戏开发的首先工具。
二、Unity3D界面介绍
Unity3D的基本界面层次清晰,几个窗口实现了全部的编辑功能。主界面如图1所示:
场景面板:该面板为Unity3D的编辑面板或者说是工作区;开发者可以将所有的模型、灯光、以及其他材质对象拖放到当前场景中,构建游戏中所能呈现的景象。
动画面板:该面板可以呈现完整的动画效果。显示的内容取决于场景摄像机的设置。当游戏在场景面板中编辑好后,点击运行按钮,即可在动画面板中查看游戏的实际运行效果。
■
项目面板:该面板主要功能是显示该项目文件中的所有资源列表。除了模型、材质、字体等,还包括该项目的各个场景文件。开发者可以将游戏中使用到的所有资源导入到该面板中,使用时只要用鼠标拖动到场景面板即可。
层次面板:该面板主要功能是显示放在场景面板中的所有的物体对象。该面板可以清楚查看在场景面板中出现的所有对象,很方便对场景中的对象进行管理。
对象属性栏:又叫检视面板,该面板栏会呈现出任何对象的属性和组件,包括三维坐标、旋转量、缩放大小、脚本的变量和对象等。
场景调整工具:可以改变在编辑过程中的场景视角、物体世界坐标和本地坐标的更换、物体的法线中心的位置,以及物体在场景中的坐标位置、缩放大小等。
三、接鸡蛋游戏的制作流程
一款手机游戏的开发大致经历立项、制定策划大纲、制作游戏、检测调试等过程。本文以接鸡蛋这个小游戏为例,描述Unity3D开发Andoird游戏的基本流程。
游戏的基本玩法是鸡蛋从屏幕上方落下,通过左右移动屏幕下方的木桶接住从上方落下的鸡蛋,鸡蛋落到木桶中及得分。游戏开发的基本步骤如下:
1.新建工程和场景
一个游戏就是一个项目,一个关卡就是一个场景,在Unity3D的文件菜单中选择新建项目,为新项目命名,如图2所示,新建项目的同时会新建第一个场景,保存新场景。
■
2.导入资源
游戏使用到的资源主要包括游戏对象模型、材质、贴图、声音等,模型可以在Maya,3DMax等3D建模工具中做好,导出为FBX格式的文件,然后在Unity3D的项目面板中选择导入资源菜单导入游戏资源。接鸡蛋主要模型资源有木桶、鸡蛋、草地、白云等模型。
3.搭建游戏场景
将游戏资源从项目面板拖入到场景面板中进行游戏场景的搭建,通过移动、缩放、旋转等工具将游戏资源对象按照一定的空间顺序进行搭建,最终效果如图3所示:
■
4.编写游戏脚本
(1)桶移动:PlayerScript.cs
木桶的左右移动是通过PlayerScript.cs来控制的,Unity3D的输入系统定义了水平方向的移动,并将X方向的数值限定在-2.5到2.5之间,这样避免木桶超出屏幕范围,代码的主要部分如下:
void Update () {
float moveInput = Input.GetAxis("Horizontal") * Time.deltaTime * 3; // 木桶在水平方向移动
transform.position += new Vector3(moveInput, 0, 0);
if (transform.position.x <= -2.5f || transform.position.x >= 2.5f){ // 限制木桶的移动范围
float xPos = Mathf.Clamp(transform.position.x, -2.5f, 2.5f); // 木桶在-2.5和2.5之间移动
transform.position = new Vector3(xPos, transform.position.y, transform.position.z);
}}
将PlayerScript.cs拖至木桶对象上,使得其成为木桶对象的脚本组件。
(2)鸡蛋落下:EggScript.cs
鸡蛋落下由EggScript.cs来控制,当鸡蛋落至屏幕下方足够低的地方的时候,鸡蛋自动销毁,以免占有资源,代码主要部分如下:
void Update () {
float fallSpeed = 2 * Time.deltaTime;
transform.position -= new Vector3(0, fallSpeed, 0);
if (transform.position.y < -1 || transform.position.y >= 20) // 位置足够低的时候销毁对象
{Destroy(gameObject);}}
同样将EggScript.cs拖至鸡蛋对象上,使得其成为鸡蛋对象的脚本组件之一。
(3)生成鸡蛋:SpawnerScript.cs
鸡蛋源源不断的从屏幕上方落下,即是通过SpawnerScript.cs脚本来生成鸡蛋,并且每隔0.3秒,鸡蛋的生成速度会不断的增加,主要代码如下:
void Update () {
if (nextEggTime < Time.time)
{
SpawnEgg();
nextEggTime = Time.time + spawnRate;
spawnRate *= 0.98f; // 生成速度逐渐加快
spawnRate = Mathf.Clamp(spawnRate, 0.3f, 99f);
}}
void SpawnEgg()
{
float addXPos = Random.Range(-1.6f, 1.6f); // 水平位置由随机函数产生的数值来生成
Vector3 spawnPos = transform.position + new Vector3(addXPos,0,0);
Instantiate(eggPrefab, spawnPos, Quaternion.identity); // 初始化鸡蛋
}
同样将EggScript.cs拖至鸡蛋对象上,也使得其成为鸡蛋对象的脚本组件之一。
(4)碰撞检测,计分:EggCollider.cs
在木桶底部有一个球体对象,设置为碰撞器,来检测鸡蛋是否与其发生碰撞,或者说来判断木桶是否接到了鸡蛋,如果碰撞到则进行计分,代码主要部分如下:void Awake()
void OnTriggerEnter(Collider theCollision) // 碰撞检测
{
GameObject collisionGO = theCollision.gameObject;
Destroy(collisionGO);
myPlayerScript.theScore++;// 本游戏中碰撞的物体只可能是鸡蛋,检测到即销毁鸡蛋对象,同时计分
}
将EggCollider.cs拖至球体碰撞器对象上,也使得其成为碰撞器对象的脚本组件。
5.发布游戏
游戏代码完成,测试无错后就可以发布成Android应用程序了,选择文件菜单>构建设置,在弹出的对话框中可以看见我们的游戏可以发布到多个平台上,这里我们选择Android,如图4所示:
■
在发布设置中,设置游戏名称、默认图标、Android版本等基本信息,最后点击构建按钮即可生成最终的Andoid打包文件,导入手机中就可以运行了。
四、结束语
本文通过一个小游戏的制作过程,描述了Unity3D的基本界面、基本操作和使用Unity3D开发游戏的基本流程。Unity3D不但可以开发3D游戏还可以开发2D游戏和其他大型网络在线游戏,同样是画面绚丽,效果出众。
做为一个成熟的游戏引擎和开发工具,Unity3D其开发能力毋庸置疑,随着iOS,Android手机的大量普及和3D网页游戏的兴起,Unity3D因其强大的功能、良好的可移植性和易用性在手机游戏和网页游戏平台上必将得到了广泛的使用和传播。
参考文献:
[1]Ryan Henson Creighton.Unity 3D Game Development by[J].Example Beginners Guide,2010(9).
[2]金玺曾.Unity 3D手机游戏开发[M].北京:清华大学出版社,2013.
if (transform.position.y < -1 || transform.position.y >= 20) // 位置足够低的时候销毁对象
{Destroy(gameObject);}}
同样将EggScript.cs拖至鸡蛋对象上,使得其成为鸡蛋对象的脚本组件之一。
(3)生成鸡蛋:SpawnerScript.cs
鸡蛋源源不断的从屏幕上方落下,即是通过SpawnerScript.cs脚本来生成鸡蛋,并且每隔0.3秒,鸡蛋的生成速度会不断的增加,主要代码如下:
void Update () {
if (nextEggTime < Time.time)
{
SpawnEgg();
nextEggTime = Time.time + spawnRate;
spawnRate *= 0.98f; // 生成速度逐渐加快
spawnRate = Mathf.Clamp(spawnRate, 0.3f, 99f);
}}
void SpawnEgg()
{
float addXPos = Random.Range(-1.6f, 1.6f); // 水平位置由随机函数产生的数值来生成
Vector3 spawnPos = transform.position + new Vector3(addXPos,0,0);
Instantiate(eggPrefab, spawnPos, Quaternion.identity); // 初始化鸡蛋
}
同样将EggScript.cs拖至鸡蛋对象上,也使得其成为鸡蛋对象的脚本组件之一。
(4)碰撞检测,计分:EggCollider.cs
在木桶底部有一个球体对象,设置为碰撞器,来检测鸡蛋是否与其发生碰撞,或者说来判断木桶是否接到了鸡蛋,如果碰撞到则进行计分,代码主要部分如下:void Awake()
void OnTriggerEnter(Collider theCollision) // 碰撞检测
{
GameObject collisionGO = theCollision.gameObject;
Destroy(collisionGO);
myPlayerScript.theScore++;// 本游戏中碰撞的物体只可能是鸡蛋,检测到即销毁鸡蛋对象,同时计分
}
将EggCollider.cs拖至球体碰撞器对象上,也使得其成为碰撞器对象的脚本组件。
5.发布游戏
游戏代码完成,测试无错后就可以发布成Android应用程序了,选择文件菜单>构建设置,在弹出的对话框中可以看见我们的游戏可以发布到多个平台上,这里我们选择Android,如图4所示:
■
在发布设置中,设置游戏名称、默认图标、Android版本等基本信息,最后点击构建按钮即可生成最终的Andoid打包文件,导入手机中就可以运行了。
四、结束语
本文通过一个小游戏的制作过程,描述了Unity3D的基本界面、基本操作和使用Unity3D开发游戏的基本流程。Unity3D不但可以开发3D游戏还可以开发2D游戏和其他大型网络在线游戏,同样是画面绚丽,效果出众。
做为一个成熟的游戏引擎和开发工具,Unity3D其开发能力毋庸置疑,随着iOS,Android手机的大量普及和3D网页游戏的兴起,Unity3D因其强大的功能、良好的可移植性和易用性在手机游戏和网页游戏平台上必将得到了广泛的使用和传播。
参考文献:
[1]Ryan Henson Creighton.Unity 3D Game Development by[J].Example Beginners Guide,2010(9).
[2]金玺曾.Unity 3D手机游戏开发[M].北京:清华大学出版社,2013.
if (transform.position.y < -1 || transform.position.y >= 20) // 位置足够低的时候销毁对象
{Destroy(gameObject);}}
同样将EggScript.cs拖至鸡蛋对象上,使得其成为鸡蛋对象的脚本组件之一。
(3)生成鸡蛋:SpawnerScript.cs
鸡蛋源源不断的从屏幕上方落下,即是通过SpawnerScript.cs脚本来生成鸡蛋,并且每隔0.3秒,鸡蛋的生成速度会不断的增加,主要代码如下:
void Update () {
if (nextEggTime < Time.time)
{
SpawnEgg();
nextEggTime = Time.time + spawnRate;
spawnRate *= 0.98f; // 生成速度逐渐加快
spawnRate = Mathf.Clamp(spawnRate, 0.3f, 99f);
}}
void SpawnEgg()
{
float addXPos = Random.Range(-1.6f, 1.6f); // 水平位置由随机函数产生的数值来生成
Vector3 spawnPos = transform.position + new Vector3(addXPos,0,0);
Instantiate(eggPrefab, spawnPos, Quaternion.identity); // 初始化鸡蛋
}
同样将EggScript.cs拖至鸡蛋对象上,也使得其成为鸡蛋对象的脚本组件之一。
(4)碰撞检测,计分:EggCollider.cs
在木桶底部有一个球体对象,设置为碰撞器,来检测鸡蛋是否与其发生碰撞,或者说来判断木桶是否接到了鸡蛋,如果碰撞到则进行计分,代码主要部分如下:void Awake()
void OnTriggerEnter(Collider theCollision) // 碰撞检测
{
GameObject collisionGO = theCollision.gameObject;
Destroy(collisionGO);
myPlayerScript.theScore++;// 本游戏中碰撞的物体只可能是鸡蛋,检测到即销毁鸡蛋对象,同时计分
}
将EggCollider.cs拖至球体碰撞器对象上,也使得其成为碰撞器对象的脚本组件。
5.发布游戏
游戏代码完成,测试无错后就可以发布成Android应用程序了,选择文件菜单>构建设置,在弹出的对话框中可以看见我们的游戏可以发布到多个平台上,这里我们选择Android,如图4所示:
■
在发布设置中,设置游戏名称、默认图标、Android版本等基本信息,最后点击构建按钮即可生成最终的Andoid打包文件,导入手机中就可以运行了。
四、结束语
本文通过一个小游戏的制作过程,描述了Unity3D的基本界面、基本操作和使用Unity3D开发游戏的基本流程。Unity3D不但可以开发3D游戏还可以开发2D游戏和其他大型网络在线游戏,同样是画面绚丽,效果出众。
做为一个成熟的游戏引擎和开发工具,Unity3D其开发能力毋庸置疑,随着iOS,Android手机的大量普及和3D网页游戏的兴起,Unity3D因其强大的功能、良好的可移植性和易用性在手机游戏和网页游戏平台上必将得到了广泛的使用和传播。
参考文献:
[1]Ryan Henson Creighton.Unity 3D Game Development by[J].Example Beginners Guide,2010(9).
Unity3D技术 第4篇
树形结构对果树的产量和品质有着重要的影响,修剪是取得优质高效树形结构的主要技术手段。例如,通过整形和修剪改变花期和营养生长[1],或用来控制树形及平衡营养生长和生殖生长[2]。然而,传统剪枝主要依据经验知识对树冠进行修剪,其操作过程不可逆[3]。目前,果树修剪技术培训和推广工作中,主要存在以下问题:一是传统口头讲解、教学光盘等形式的果树修剪技术培训不能够直观形象、效果欠佳;二是掌握果树修剪技术的科技人员相对短缺[4];三是在农村普及正确的修剪技术有一定难度[4]。
随着信息技术的发展,虚拟植物(果树)为生长建模、过程模拟、可视化计算分析等提供信息服务和技术支撑[5]。因此,如何通过信息技术手段改进果树修剪技术培训和科技推广成为各国科研人员的研究兴趣。虚拟现实从应用上看是一种综合计算机图形学技术、多媒体技术、人机交互技术、网络技术、立体显示技术及仿真技术等多种科学技术综合发展起来的计算机领域的最新技术,也是力学、数学、光学、机构运动学等各种学科的综合应用[6]。如果将其应用到果树修剪中,将为树形分析研究、果树修剪技术培训等应用提供一种全新的技术手段,缩短在真实果树上进行修剪试验的时间,同时极大地降低成本。
近年来,不少国内外研究者围绕果树的虚拟修剪进行了研究。Balandier等人[7]以单株的幼年核桃树为例,设计了一种SIMWAL的功能结构模型,根据枝叶生长、修剪时间、修剪点等参数对模型进行修剪,研究气候变化与枝条修剪对核桃树的影响。潘云鹤等[8]提出了一种交互设计技术的果树树形修整方法,从树根遍历所有枝条是否执行剪除操作,缺点是不能对某根枝条进行交互式修剪和编辑操作。王剑[1]等提出通过创建修剪规则库,利用鼠标控制模型运行的参数将修剪动作映射到相应的规则中,然后根据规则将相应修剪后的模型进行可视化输出。以上研究修剪过程不够自然,树木真实感比较差,不能满足真实的果树修剪也限制了果树虚拟修剪系统的推广应用。同时,还有一些植物建模软件如Xfrog、Onyx Tree等,与真实的剪枝也有较大差距。基于以上不足,本文试图提出一种更加自然、树木真实感更好,并使用“虚拟剪刀”的交互修剪技术,为果品产业提供一个可视化、智能化的修剪管理新途径。
1 关键技术
1. 1 Unity3D 虚拟现实技术
虚拟现实是利用电脑模拟产生一个三维空间的虚拟世界,提供使用者关于视觉、听觉、触觉等感官的模拟,让使用者如同身历其境一般,可以及时、没有限制地观察三度空间内的事物[9]。本文涉及的Unity3D是专业的虚拟现实开发引擎,可用于创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容。其开发界面如图1所示。
首先,Unity3D是一个层级式的综合开发环境[10],开发者可以根据自己的视觉习惯选择不同的编辑类型显示,编辑区有详细的属性编辑器和动态的游戏预览;其次,一个完整的Unity3D项目是由若干个场景和场景中的界面组合起来的,每个场景中又包含许多模型,并通过脚本来控制它们的交互行为;最后,Unity3D拥有强大的物理引擎,能模拟现实世界中的物理现象(如碰撞和重力效果),并且还提供粒子系统(如火焰、雾和瀑布等效果)。
本文将三维重建后的果树模型导入Unity3D,通过场景编辑视图创建虚拟果园。为了加快计算速度及提高交互性,对模型从3个方面进行优化:1合并使用同贴图的材质球及其Mesh;2创建预置,将场景中重复使用的模型定义为预置体(Prefab),并通过动态异步加载的方式加载模型;3使用光照贴图。像素的动态光照将对顶点变换增加开销,使用光照贴图减少开销。
为了提高软件的运行效率,对代码也进行了如下优化:1尽量避免每帧处理,如Update函数改为每5帧处理1次;2主动回收垃圾;3优化数学计算等。
总之,Unity3D拥有优化的图形渲染管道,应用程序能协调并行工作,把它作为虚拟开发平台,克服了传统方法开发周期长、数据兼容性差及发布平台受限等缺点。
1. 2 建立三维模型库
人们获取物体的三维模型的方式有3种[11]:一是通过三维扫描设备来获取;二是通过建模软件构造三维模型;三是通过利用图像来重建三维模型。本文取第1种方式,具有过程如下:首先,利用三维扫描仪获取果树几何构造与外观数据,根据农学知识分析数据并提取模型关键特征;其次,基于知识建立数字植物的三维形态模型,实现植物对象数字化可视化表达[12];最后,完成三维重建,将模型保存模型库满足交互应用需求。三维模型库构建流程如图2所示。
图2 三维模型库构建流程
本文三维重建后,需要导出FBX格式文件,在导出之前需要注意以下步骤[13]: 1检查模型法线是否正确;2检查材质和对象是否规范;3检查场景模型的组别和层次是否满足需要;4检查各物体的局部坐标朝向;5检查UV是否正确。通过这些步骤导出模型,然后再导入到Unity中;导入Unity后对待修剪的枝条进行单位大小调整及添加物理属性碰撞体组件处理,否则鼠标无法完成拾取操作。
1. 3 果树修剪技术
果树在生长发育过程中,根据每个时期的生长特点和要求,所采用的修剪方式也不一样。本文以柑橘为例,柑橘树一生要经历幼年、成年和衰老等生物学阶段,就修剪而言,不同阶段的技术要点不同[14]:幼树期修剪的目的是整形,主要通过抹芽放梢及疏除花蕾;初结果期修剪是为了保持坐果率,采取适当除果及剪除徒长枝的方式;衰老期修剪以保持树形为主,一般做法是剪掉下垂枝;衰老期修剪要进促进其长势,通过轮换更新和主枝更新的方法修剪。不同时期修剪规则图解如图3所示。
1. 4 射线拾取技术
拾取是计算机图形处理系统一个重要功能,是图形绘制、操作者通过输入设备操纵屏幕上的物体、获取物体的空间坐标或图形数值的实现基础[15]。本文主要通过射线拾取算法实现鼠标拾取场景中的物体(修剪点),并判断由视点发出经屏幕光标的射线是否与目标物体相交。射线拾取原理图如图4所示。
z = 0处为视椎体近剪裁面,z = 1处为远剪裁面。其中,P0为发射指向P1,也就是2D平面的一个点映射至3D空间的一条射线。具体实现方法:
1) 获取屏幕上的点,并找到其对应的投影窗口上的点。
2) 计算拾取射线。其是一条从屏幕上点击的一点出发的射线。
3) 将射线乘以观察矩阵和投影矩阵连乘后的联合矩阵的转置逆矩阵,并变换到和模型相同的坐标系当中。
4) 判定物体和射线求交,被穿过的物体就是屏幕上拾取的物体。
图3 柑橘修剪规则
1. 5 碰撞检测技术
碰撞检测是视景仿真中的重要研究内容,也是虚拟环境产生沉浸感的重要手段,可以使用户以更自然的方式与仿真系统中的场景对象进行交互[16]。碰撞检测主要有空间分解法和包围盒层次法两大类,空间分解法存储量大、不灵活。本软件使用包围盒层次法检测“虚拟剪刀”模型是否柑橘枝条模型的碰撞。其基本思想是用简单的包围盒将复杂的几何形状围住,当对两个物体进行碰撞检时,先对包围盒求交,若相交,则只对包围盒重叠的部分进一步相交测试。当模型几何结构很复杂时,使用这种方法可以提高计算速度,满足虚拟环境中实时性的要求。
如果要进一步提高修剪的沉浸感与趣味性,可与leap motion体感设备相结合,通过手势识别控制“虚拟剪刀”进行修剪操作。
2 软件实现与实例验证
2. 1 软件简介
本文研究的“果树虚拟修剪软件”是将果树修剪技术、信息技术及虚拟现实技术相结合的果树虚拟修剪仿真软件。以单株果树模型为例,用户可以对模型进行旋转、缩放及移动等操作,并使用“虚拟剪刀”的方式模拟其从幼树期到衰老期的交互修剪。通过这种方式,将果树较长的生长周期在短时间内模拟生长,缩短了在真实树木上修剪试验的时间,降低了成本。通过反复练习,来达到快速掌握科学修剪技术的目的。
2. 2 开发环境及流程
本文通过Unity 3D开发平台进行虚拟果园场景编辑并采用c#、JavaScript脚本控制虚拟交互修剪操作。硬件环境为CPUp5200、2. 5Hz、内存2G、WindowsXP操作系统。开发流程主要分为4个步骤:1数据采集。通过广泛收集果树修剪需要的媒体素材包括图片、文字、声音、视频及动画等。2获取果树三维模型。使用三维扫描仪获取果树形态数据,三维重建后导出FBX格式文件。3搭建果园场景,将重建后的果树模型导入Unity,使用Unity引擎优化模型、调节“虚拟剪刀”执行修剪动作动画及编写脚本。4测试并发布。对系统进行优化并测试,调试完善后发布exe及网络版本。
2. 3 实例验证
实验以柑橘某枝条疏花疏果及果实采摘为例,通过鼠标交互快速、高效地拾取修剪点。此外,还可以对柑橘模型进行旋转、缩放、移动等操作。交互修剪流程图如图5所示。
1) 疏花疏果模拟:柑橘通过疏花疏果,将过多的花、果疏除,有利于提高果实品质,保证树体健壮[17]。疏花疏果能够模拟现实柑橘根据叶果比法进行疏花、疏果等操作。不同的品质叶果比是不同的:温州蜜柑叶果比应保持在(20 ~25):1,而茂谷柑叶果比是(50~ 60):1。在柑橘某枝条上模拟疏花疏果,如图6( a)所示。根据设置的修剪点,通过鼠标选择修剪点(枝、叶、花等对象),若选择正确,则出现“虚拟剪刀”,如图6( b) 所示。然后“虚拟剪刀”检测修剪点并执行修剪动作动画剪掉所选对象,修剪后“虚拟剪刀”及所选对象消失,效果如图6(c)所示。若选择错误,则弹出操作错误提示界面,点击重新选择可继续点选。与文献[18]实验修剪结果相比(见图7和图6(d)),可知本软件树木真实好,并通过“虚拟剪刀”的形式使得修剪更自然,交互性更好。
2) 果实采摘模拟 :采果时应遵循“一果两剪”方法:第1剪带果柄约3 ~4mm剪断,第2剪则齐果蔕把果柄剪去,并且应由下而上,由外到内,以免损伤果皮。果实采摘模拟,首先通过二维界面的形式让用户选择“虚拟剪刀”的使用方式,果剪有正手与反手两种方式。在第1剪时,使用者应选择正手,如图8(a)所示。通过鼠标点击正手方式时,则出现“虚拟剪刀”,如图8(b)所示。播放修剪动作动画将带果柄的果实剪掉,剪掉的果实放到容器中,然后再选择反手进行第2剪(即剪去果柄),完成果实采摘过程。
图7 文献21 芦柑几何模型交互修剪模拟
图8 果实采摘模拟
实验结果表明,本研究通过Unity3D创建果园场景虚拟方法,树木真实感强,符合自然的修剪,即当剪除母枝时,其子枝也被剪除;通过设置多个修剪点及反馈机制,增加了交互性;通过“虚拟剪刀”及其修剪动画的方式,提高了修剪的趣味性。
3 结论与展望
本研究是果树修剪方面的初步探索,也是在数字农业、虚拟农业应用中的尝试。从虚拟修剪效果来看,具有树木真实感好、符合真实人工修剪操作的优点。通过“虚拟剪刀”的形式有利于增加交互的趣味性,提升教学及培训人员的热情,从而快速掌握科学的修剪方法。但是要注意,应该根据不同树种与品种的生物学特性,以及不同树龄、树势和自然条件的特点,合理进行整形与修剪,才能收到预期的效果[19]。所有的一切都是建立在灵活应用科学的整形修剪技术之上的,所以园林树木的整形修剪是栽培和管理创新的重要措施[20]。由于修剪后形态发展的复杂性,对修剪后形态生理发展的模拟还有待于进一步研究。
Unity3D技术 第5篇
学飞机大战好几天了,今天就总结一下飞机大战所学的知识,所遇到的困难,还有常出现在错误。
一:资源包的导入,场景的搭建步骤不在阐述在这包的导入和创建新文件夹在回顾一下Scences存放场景视图,Scripts存放脚本,Resources存放资源包,资源包下有Textures存放图片,Materials存放材质,Audios存放声音,Madels存放模型。
二:脚本的建立
(1)玩家的飞机的前后左右的移动代码如下:
float x = Input.GetAxis(“Horizontal”);//左右移动 float z = Input.GetAxis(“Vertical”);//前后移动 transform.Translate(-x,0,-z);(2)子弹的不停发射我们采用了鼠标事件用if判断代码如下:
if(Input.GetMouseButtonDown(0)||Input.GetKey(KeyCode.Space))//鼠标左键或空格发射子弹
(3)子弹的个数我们用克隆的方法代码如下:
GameObject u=GameObject.Instantiate(yushe,transform.position,Quaternion.identity)as GameObject;//Instantiate有三个参数一个是所克隆的对象,第二个是所克隆的位置,第三个是位置。
(4)在克隆出子弹时,子弹是静止不动的,我们在给它加个力,有于我这个脚本是挂在子弹预设体上的代码如下:
u.rigidbody.AddForce(0,0,-8000);//有三个参数,一个是X轴的力,一个是Y轴的力,一个是Z轴的力。
(5)敌机的飞行就按傻瓜的来所代码如下:
transform.Translate(new Vector3(0,0,-1));//有三个参数,一个是X轴的飞行,一个是Y轴的飞行,一个是Z轴的飞行。
(6)敌机的子弹发射也是傻瓜类型代码如下: float rocketTime=1;//给敌机所发射的时间
rocketTime-= Time.deltaTime;//时间递减 if(rocketTime<=0){//如果时间小于零为真 rocketTime=1;GameObject
aa=GameObject.Instantiate(EnPeoRo2,transform.position,Quaternion.identity)as GameObject;aa.rigidbody.AddForce(0,0,8000);//给敌机子弹加力
(7)子弹的销毁,脚本添加给玩家子弹的预设体上代码如下:
Destroy(this.gameObject,2);//俩个参数一个是销毁目标,而是几秒后所消失
(8)敌机子弹的消失,脚本添加给敌机脚本代码如下:
Destroy(this.gameObject,2);(9)玩家子弹打到敌机时,敌机消失代码如下 void OnTriggerEnter(Collider aa){//添加触发器
if(aa.tag==“PlayRocket”){//如果玩家的子弹碰到标签为PlayRocket则为真 //Debug.Log(collision.gameObject.name);
Destroy(this.gameObject);//销毁目标
}else if(transform.transform.position.z>=227){//当敌机飞出电脑屏幕敌机自动 } } Destroy(this.gameObject);销毁
(10)当敌机子弹打到玩家飞机时则玩家飞机生命减少,若干次销毁代码如下;void OnTriggerEnter(Collider aa){
}
if(aa.tag==“EnenmyRocket”){//打到一次
} i--;//生命建少一次 if(i==0){//当减为零时为真 Destroy(this.gameObject);}//销毁目标
具体代码如下:
玩家飞机代码public class PlayerPlan : MonoBehaviour {
public GameObject yushe;int i=2;// Use this for initialization void Start(){ }
// Update is called once per frame void Update(){
float x = Input.GetAxis(“Horizontal”);float z = Input.GetAxis(“Vertical”);transform.Translate(-x,0,-z);if(Input.GetMouseButtonDown(0)||Input.GetKey(KeyCode.Space)){ GameObject
u=GameObject.Instantiate(yushe,transform.position,Quaternion.identity)as GameObject;
} void OnTriggerEnter(Collider aa){
}
if(aa.tag==“EnenmyRocket”){
} i--;if(i==0){ Destroy(this.gameObject);} } u.rigidbody.AddForce(0,0,-8000);}
玩家子弹代码如下: using UnityEngine;using System.Collections;
public class PlayRicket : MonoBehaviour {
} 敌机子弹代码: using UnityEngine;using System.Collections;
public class EnProRock2 : MonoBehaviour {
public GameObject EnPeoRo2;float rocketTime=1;// Use this for initialization void Start(){ }
// Update is called once per frame void Update(){
} //this.gameObject.rigidbody.AddForce(Vector3.back);Destroy(this.gameObject,2);// Use this for initialization void Start(){ }
// Update is called once per frame void Update(){
rocketTime-= Time.deltaTime;if(rocketTime<=0){ rocketTime=1;GameObject
aa=GameObject.Instantiate(EnPeoRo2,transform.position,Quaternion.identity)as GameObject;
} } aa.rigidbody.AddForce(0,0,8000);} 敌机代码如下: using UnityEngine;using System.Collections;
public class EnenmyPeople2 : MonoBehaviour {
}
if(aa.tag==“PlayRocket”){
} } // Use this for initialization void Start(){ }
// Update is called once per frame void Update(){ } void OnTriggerEnter(Collider aa){ transform.Translate(new Vector3(0,0,-1));//Debug.Log(collision.gameObject.name);
Unity3D技术 第6篇
关键词:Unity3D技术,化工装置,虚拟培训
1 引言
三维虚拟现实技术是当今计算机科学研究的一个热点, 将三维虚拟现实技术引入化工装置训练系统的研究中, 有利于化工厂形象的展示, 并对化工厂区的进一步建设和合理规划及布局提供逼真的可视化平台, 为化工行业工作人员培训和生产现场检测提供一种全新的手段。化工装置因其工作介质易燃易爆的特点, 在实际生产过程中存在很大的安全隐患, 有很多装置一旦发生紧急故障, 如果不能快速正确处理, 其后果不堪设想。同时, 化工行业多数生产装置都具有不间断作业、高温、高压、易燃易爆和设备价格昂贵等特点[1,2], 这就要求每一位现场操作人员在上岗之前必须进行培训, 具备很高业务素质。如果在生产车间实地进行关键技术和设备操作的培训, 一方面会影响车间日常生产, 增加培训难度;另一方面增加了培训的风险与成本, 且整体培训效果明显不高。因此, 在保证生产装置安全、满负荷、长期、稳定、优质运行的情况下, 积极地开展有针对性的虚拟化操作训练显的尤为重要[2]。
运用Unity3D技术, 实现化工装置虚拟培训系统的开发, 通过对厂地结构布局、设备安装位置、设备基本信息、设备结构、工作原理、工作流程、标准操作、设备故障分析等功能模块的设置, 为使用者和化工生产场景之间搭建一个实时交互的虚拟环境, 在不破坏实际生产连续性的前提下, 模拟各种化工工艺条件下的生产状态, 实现对化工生产过程的全面学习和岗前培训, 使员工快速熟悉和掌握化工装置的工艺流程, 积累丰富的生产操作经验。本文通过对化工生产过程特点进行总结, 介绍基于Unity3D的化工装置虚拟培训系统设计流程、整体结构和功能, 分析系统的优点, 对积极开展有针对性的虚拟化操作培训具有重要的指导意义。
2 虚拟现实技术及Unity3D技术
2.1 虚拟现实技术的发展及研究现状
1965年, 美国ARPA信息处理技术办公室主任Ivan Sutherland第一次提出了虚拟现实的概念。1989年, 美国VPL公司奠基人Jaron Lanier正式提出了“Virtual Reality”一词, 明确指出研究虚拟现实技术的目的是为了提供一种在传统计算机模拟基础上的更好方法。1990年, 在美国达拉斯召开的会议上明确提出了虚拟现实技术的主要内容是实时三维图形生成技术、多传感器交互技术和高分辨率显示技术, 为虚拟现实技术的发展确定了研究方向。1966年, 美国MIT实验室研制出了第一个虚拟现实系统[3]。
我国对虚拟现实技术的研究始于20世纪90年代初, 起步较晚但发展迅速, 到现在已取得了很好的成果。清华大学国家光盘工程研究中心设计出了我国第一个虚拟现实技术与电子出版物结合的“布达拉宫”。1996年, 国家“863计划”开始对支持产品生命周期全过程的虚拟制造平台的内涵以及关键技术设立专门项目进行系统研究。
2.2 Unity3D技术
Unity3D[4,5,6,7]是由Unity technologies开发的一个创建诸如三维视频游戏、建筑可视化、信息可视化、实时三维动画等类型互动内容的跨平台、层级式的综合型游戏开发工具, 是一个对编辑器、跨平台发布、地形编辑、着色器、脚本、网络、物理、版本控制等特性全面整合的专业游戏引擎, 能模拟现实世界中的物理现象, 并且提供粒子系统这样一个功能来实现许多炫丽特效。Unity3D具有视觉化的编辑, 详细的属性编辑器和动态的游戏预览, 性价比高, 并且可以发布成网页浏览的方式, 不用下载客户端, 就可以直接体验;能和大部分相关应用程序协同工作, 支持所有主要文件格式, 支持网页嵌入, 支持各种脚本语言, 其中包括Java Script、C#、Python, 兼容各类操作系统[8,9]。正是因为这些特性, Unity3D越来越多的被应用到三维场景的开发工作中。
3 基于Unity3D的化工装置虚拟培训系统
化工装置虚拟培训系统将化工厂的基本安全知识和经常发生的各类典型事故案例、工艺流程以及控制室和操作现场的各种设备安全操作规程进行计算机模拟是一种很好的选择。该培训系统不同于传统的生产安全操作培训, 主要是为化工厂常见的、易发生操作事故的生产操作过程提供一套计算机虚拟的、交互的安全操作仿真演练平台, 使参加培训的人员进入一个虚拟的生产环境中, 使安全操作的培训更加生动、形象、易于接受, 从而提高安全生产的管理和实践水平。
3.1 化工生产的特点
化工生产的特点主要表现为: (1) 涉及物料种类多, 原材料、中间体和产品的性质差异大, 多是高温高压、易燃易爆、有毒和腐蚀性强的物质; (2) 生产中涉及各种反应类型, 产品不同, 其特性及工艺条件相差悬殊, 工艺操作过程中高温高压现象普遍, 影响因素多而易变, 工艺条件要求苛刻; (3) 装置具有大型化、自动化、连续化以及智能化的特点, 一旦发生危险, 其影响、损失和危害巨大; (4) 装置的系统性和综合性强, 不仅体现在生产系统内部的原料、中间体、成品纵向上的联系, 还体现在公用工程, 如水电汽等能源的供给, 机械设备、电器、仪表等的维护和保障, 任何系统或部门的运行状况都将影响甚至是制约化学工艺系统内的正常运行与操作。现代大型化工生产装置的科学、安全和熟练地操作控制, 需要操作人员具有现代化学工艺理论知识与技能、高度的安全生产意识和责任感。
3.2 基于Unity3D的化工装置虚拟培训系统设计流程
化工装置虚拟培训系统的设计按照软件工程的设计思路, 从系统需求分析入手, 设计系统各个功能模块。在具体开发时, 首先参照设备照片资料、厂区布局应用3Ds Max、Photoshop软件完成三维建模, 并转换为Unity3D可以兼容的FBX格式。将模型导入Unity3D平台, 进行场景效果设置, 完成整个场景构建。场景构建完毕后对系统界面交互、三维场景交互及声音字幕协同技术进行研究, 根据培训需求完成设备基本信息、设备结构、工作原理、标准操作、故障分析等功能模块的开发, 生成界面友好、操作简单、实用性强的系统, 全面实现化工设备的培训[10]。基于Unity3D的化工过程装置虚拟培训系统整体设计流程如图1所示。
3.3 基于Unity3D的化工装置虚拟培训系统结构设计
基于Unity3D的化工装置虚拟培训系统运用Unity3D技术配合虚拟实现硬件设备在电脑终端为参与培训的化工生产作业人员提供真实的虚拟场景, 系统分为管理员计算机系统和培训计算机系统两部分。管理员计算机系统主要由化工设备库、图形控制模块、正确性检测模块、评分生成模块、组装拆卸模块、显示屏提示模块、故障生成模块、打印帮助模块及电脑终端等构成, 其中化工设备库由部件库、属性库、信息库三部分组成。培训计算机系统主要包括监视和操作两部分。基于Unity3D的化工装置虚拟培训系统整体结构如图2所示。培训计算机系统通过与管理员计算机系统进行网络通讯完成培训计算机的关键设备虚拟化操作, 同时管理员计算机系统也通过与培训计算机系统的网络通讯实施对培训计算机系统的操作进行监控的功能。
3.4 基于Unity3D的化工装置虚拟培训系统功能
目前, 化工装置虚拟培训系统已经成为化工生产不可或缺的职业培训手段, 通过仿真培训, 不断完善化工过程装置虚拟培训系统的建设, 不断拓展仿真培训在化工生产领域的范围, 优化虚拟培训系统运行状态设置, 提高操作人员操作技术, 具体表现在以下几方面[11]。
(1) 化工过程装置虚拟培训系统是新建装置开工前和新进员工上岗前培训的主要载体, 利于员工在安全高效的环境下掌握生产流程操作方法, 熟悉DES操作与功能。
(1) 熟悉和掌握工艺流程和现场操作技术; (2) 培训开工、停工、正常运行操作法及事故处理; (3) 对开工、停工进行指导; (4) 熟悉自控方案, 为生产控制、优化操作提供参考。
(2) 指导操作员工了解化工生产工艺机理。 (1) 为事故预测和诊断系统提供模拟环境; (2) 加深工艺过程、原理的理解; (3) 强化工人岗前 (或转岗) 培训。
(3) 现已成熟的基于Unity3D的化工装置虚拟培训系统的应用。 (1) 提升在岗系统操作员、仪表维护员等化工生产人员技能培训, 节省员工岗前及转岗培训费用; (2) 为装置安全、稳定、长周期、满负荷运行奠定基础; (3) 减少事故和停工次数, 提高装置经济效益; (4) 进行新建或改造装置操作技能培训; (5) 应用于技能鉴定、比赛。
4 基于Unity3D的化工装置虚拟培训系统优点
4.1 培训系统软件开发投入成本低, 培训费用少
基于Unity3D的化工装置虚拟培训系统通常是以软件的形式在计算机上运行, 其使用的材料、能耗都很低, 需要的管理人员少。同时, 由于计算机及软件技术的发展, 国内的研究机构和主要开发商已经开发出自己的虚拟系统平台, 在此基础上基于Unity3D技术开发各类不同化工装置虚拟培训系统投资更小, 培训投入的成本很低, 一次投入, 可长期反复使用。
4.2 培训效率高
基于Unity3D的化工装置虚拟培训系统具有记录和追忆功能, 使得在培训过程中对化工生产可以在某一个中间或局部过程重复多次进行, 有利于解决培训中的重点和难点问题。也可以针对高度危险或制造难度很大的化工生产事故进行仿真并用于培训, 这在现实中是无法实现的, 也缩短了化工生产操作培训的适应期。
4.3 培训工种多
基于Unity3D的化工装置虚拟培训系统软件运行在普通计算机上, 一个平台可以同时运行多个装置虚拟系统。使的不同装置的操作员工可以在一个虚拟机房参加培训, 每一个参加培训的员工都能亲自动手进行操作, 个体培训与集中培训有机结合。也可为技能操作人员的一岗多能培训提供有效途径。
4.4 培训管理容易
基于Unity3D化工装置虚拟培训系统已成为化工生产特有工种实际操作考核的主要手段, 该系统软件在计算机及其网络上运行使用, 有依据操作规程要求的自动评分与自动记录等功能, 系统中的操作评分系统为操作工的操作技能水平作出科学、客观的评分, 使得培训的组织与管理更加方便容易。
5 结语
岗位操作培训是化工生产过程中的重要组成部分, 将虚拟现实技术和Unity3D技术引入化工装置培训中, 开发出化工装置虚拟培训系统, 该培训方式改变了传统的理论学习、实际操作等方式的缺点, 为化工设备培训开辟了新的方向, 给以后化工装置设备培训方式带来新的思路。就其自身的优点来说, 一方面, 有效地降低培训成本, 规避培训风险, 另一方面, 操作人员可以身亲体验与真实状况极其相似的生产过程, 从而提高培训效果与培训质量。因此, 基于Unity3D的化工装置虚拟培训系统具有很好的推广和应用价值。并且随着虚拟现实技术、Unity3D技术、网络技术的不断发展, 虚拟培训技术也将不断完善。虚拟化的化工装置操作培训作为数字化工厂、虚拟车间等化工厂的重要组成部分, 也必将越来越多的受到生产技术人员的重视和青睐。
参考文献
[1]王春, 李磊, 刘刚.基于交互环境的石化装置虚拟培训系统[J].化工进展, 2014, 33 (2) :510-514.
[2]刘刚, 周芳, 李磊, 王春.虚拟现实在炼化设备操作培训中的应用研究[J].广东石油化工学院学报, 2012, 22 (3) :53-56.
[3]林珑, 肖鱼.虚拟现实技术在电力系统中的运用[J].科技向导, 2014, (12) :97.
[4]倪乐波, 戚鹏, 遇丽娜, 等.Unity3D虚拟展示技术的研究与应用.数字技术与应用[J].2010, 12:54-55.
[5]Won-Tak Hong, Phill-Seung Lee.Mesh based construction of flat-top partition of unity functions.Applied Mathematics and Computation[J].2013, v219, n16, 8687-8704.
[6]朱柱.基于Unity3D的虚拟实验系统设计与应用研究[D].华中师范大学硕士论文, 2012.5.
[7]王星捷, 李春花.基于Unity3D平台的三维虚拟城市研究与应用[J].计算机技术与发展.2013, 23 (4) :241-244.
[8]朱惠娟.基于Unity3D的虚拟漫游系统.计算机系统应用, 2012, 21 (10) :36-39.
[9]任国栋, 陈林华, 陶学锋, 等.基于Unity3D的虚拟博物馆信息可视化系统[J].计算机系统应用, 2013, 22 (9) :86-90.
[10]尹晓喆.虚拟培训技术在石油工业中的应用研究[D].大庆石油学院硕士论文, 2006.3.
基于Unity3D的手机游戏开发 第7篇
Unity3d是由Unity Technologies公司开发的跨平台专业游戏引擎, 是如今市场上一款全面整合的专业游戏引擎, 软件其编辑器可运行在Windows和Mac OS X双系统下, 利用其所开发的游戏可发布至Windows、Mac、Wii、iphone、Windows phone 8和Android平台。Unity游戏引擎作为一款跨平台的游戏开发工具, 其具有开发快速, 易上手, 跨平台发布, 可扩展性强等特点。这里论述开发了一款3D格斗类手机游戏的过程, 着重解决了屏幕自适应, 屏幕滑动模式, 美术资源管理, 手柄控制, 角色动画状态机, 敌人AI交互设计, 动态数据读取刷新, 攻击技能成长系统设计, 场景七大攻击技能释放与控制, 单机副本以及厢房挑战关卡设计与实现等一系列问题, 对其它类型的游戏开发具有一定的借鉴与学习参考的意义。
2 手机游戏开发关键技术
基于Unity的手机游戏开发, 手机游戏主要包含主屏幕滑屏, 界面刷新, 技能成长系统, 虚拟杆控制, 场景技能释放, 怪物AI设计等多大功能模块设计, 实现并开发游戏, 设计主要的关键技术及过程有:
(1) 通过数值计算, 设计屏幕自适应技术。
(2) 初步研究实现PC端和手机端的触屏控制, 通过Touch类和Input类设计实现在不同平台的“十字架”滑屏技术。
(3) 通过把二维空间向量转三维空间向量的方法, 实现游戏手柄的功能控制技术。
(4) 使用Mecanim动画系统设计玩家的移动状态机, 结合状态机设计手机手柄控制玩家移动技术。
(5) 设计玩家七大攻击技能模块的成长技能系统, 配置游戏道具数据创建XML表, 读取XML表信息使用字典来刷新统一管理游戏数据技术。
(6) 完成UI界面设计排版, 打包做成预制件, 控制游戏界面的加载和销毁技术。
(7) 设计实现三类敌人AI (蜘蛛, 机器人, 大boss) 人工智能, 使用大量的射线碰撞检测, 向量 (例如点乘, 叉乘) 知识完成交互式攻击技术。
(8) 实例化各类技能 (火系, 水系, 千里眼, 螺旋转, 保护, 法宝, 瞬移) , 通过协程, 视线追逐算法控制技能的移动方式以及攻击方式技术。
(9) 完成游戏的C#脚本的逻辑算法实现, 内容涉及到游戏玩法, 关卡逻辑, 数据刷新, 怪物的人工智能。
3 手机游戏客户端的设计与实现过程
3.1 手机滑屏控制模式的实现
实现在PC端与手机端的滑屏效果, 通过屏幕上下左右中间的虚拟十字架的坐标, 控制移动和定位相机位置, 屏幕滑动的运动方式分为两部分:
(1) 手指 (鼠标) 拖动相机带动屏幕移动。
(2) 当移动的距离超过一定距离时候同时释放手指 (鼠标) 相机将会自动弹簧式的移动到定位目的地, 实现了上下左右滑动屏幕。手机上下左右滑动屏幕可以摄像机照射的位置弹簧式的移动到指定位置。
算法分析
//当鼠标按下的时候
//记录手指按下的位置
//当鼠标按住的时候
//判断是水平滑动还是左右滑动, System.Math.Abs () 获取绝对值;
//左右移动的值大于上下移动的值
//左右水平滑动, 固定射线机位置的垂直分量的值
//左右移动的值小于上下移动的值
//上下垂直滑动, 固定射线机位置的水平分量的值
//鼠标抬起时刻
//判断鼠标滑动的值, 有没有超过的滑动slider Value
//使射线机移动指定位置
//滑动值太小, 使摄像机移动起始位置
3.2 游戏虚拟杆控制的实现
通过继承NGUI中Drawdropitem类实现鼠标和手指可拖动圆球状态。根据虚拟杆的大小, 设计限制虚拟杆的移动圆球移动范围离中心点的距离小于100, 当距离大于100时, 限制距离为100。接着中心圆球的位置到虚拟杆中心位置的向量方向控制玩家角色的移动方向, 紧接着根据中心可移动圆球离虚拟杆中心位置的距离长度控制玩家角色的移动速度, 整个二维平面的虚拟杆360度旋转移动, 映射到玩家在三维空间的移动。最后根据鼠标和手指的状态控制中心圆球的初始状态, 当鼠标和手指离开时候, 中心圆球将会重新回归虚拟杆的中心位置, 此时玩家将处于休闲不移动的状态, 当鼠标或者手指拖动中心圆球时候, 将启动控制玩家角色的移动状态。
算法分析
//拖动小球, 限制可拖动最大距离//继承NGUI的Draw Drop Item类可实现拖动一个UI控件 (小球) //记录小球的位置//使用input.Mouse Positon记录小球位置pos Ball//计算小球到底盘的向量, 记录向量方向和大小。
vec=pos Ball–pos Original;//记录的方向映射到三维空间 (x, y) 平面上, 360度控制角色的方向
3.3 游戏敌人AI功能的实现
蜘蛛的人工智能控制是由Unity中物体的触碰器触发, 每个蜘蛛都有一个立方体触碰器, 玩家如果进入这个范围, 将由On Collider Enter () 触发进入函数, 蜘蛛将进入攻击状态, 采取视线追逐算法调整蜘蛛的朝向和移动, 当距离玩家到一定距离的时候就会释放攻击技能。相反, 如果玩家不在攻击范围, 或者逃离到攻击范围之外, 将由On Collider Exit () 触发离开函数, 此时蜘蛛将回归到休闲巡逻状态。
机器人AI是比蜘蛛更具智能, 机器人具有巡逻状态, 只不过加入了模糊概率算法, 提高了不确定性, 增加了机器人的智能的真实性。机器人将在一个圆圈范围巡逻, 变走变看周围环境的变化, 判断是否有玩家进入攻击范围。当玩家进入攻击范围, 且玩家是在机器人的视线前方, 此时机器人将采取开枪的技能。当玩家进入攻击范围, 但玩家在机器人的视线后方, 此时判断玩家与机器人之间的距离, 如果足够近的话, 机器人将会发现玩家采取掉头攻击, 如果距离比较远, 那么玩家不会被机器人发现可以蒙混过关。
3.4 游戏动画系统技术分析
unity引擎有自带的动画系统, Mecanim动画系统, 通过状态机来控制角色的移动。逻辑及算法分析:
//当虚拟杆启动时, 角色开启移动动画状态
//获取1.4.3的vec方向和大小, 赋值给玩家
player Ani.Set Bool (idle Bool, true) ;
//当点击释放技能时, 动画状态跳转到释放技能状态的动画
player Ani.Set Bool (skill Bool, true) ;
3.5 游戏物理引擎射线技术分析
射线检测主要是从某个物体 (摄像机) , 发出一条射线, 然后进行判断射线是否碰撞到指定物体, 然后在相对于的接口函数编写出相应的反应事件, 算法分析:
//定义一条从摄像机发射到鼠标点击位置的射线
3.6 游戏技能释放分析
3.6.1 火系技能
实例化出来的位置是处于敌人的上方, 利用协程IEnumerator的程序知识控制其实例化出来的顺序, 前后一共实例化八个火炮, 当其被实例化出来的时候, 火炮将自动寻找靠近玩家的敌人进行攻击, 采取的攻击方式是视线追逐。
3.6.2 水系技能
实例化的位置比较讲究, 因为其方向和位置总要面向敌人, 所以其实例化的位置应该处于玩家的上方, 而且四个水系技能炮所处的平面是与玩家和敌人的直线垂直, 实例化之前需要先计算从敌人到玩家的方向向量的垂直向量, 得出垂直的单位向量后再乘以距离大小, 得出火系技能的左右距离, 最后加上向上的方向向量的距离就可以得出实例化位置, 实例化出来将采取视线追逐的方式对敌人进行追击。
3.6.3 瞬移技能
在释放技能的时候, 玩家将会向前方发射一条被规定好距离的射线来确定前方是否有物体, 射线进行碰撞检测, 当有碰撞到物体的时, 瞬移技能无法释放, 当射线检测不到有物体的时候, 玩家可以向前瞬间移动, 移动方法是累加玩家自身的Forward向量。
3.6.4 千里眼技能
玩家一共有三种状态, 正常的状态, 千里眼状态, 保护状态, 启动此状态时候, 只需要切换玩家的状态到千里眼的状态, 然后改变手柄的控制, 此时手柄的控制将会发生改变, 第一控制的对象由玩家到摄像机, 移动范围由一个圆圈范围到一个圆环范围, 也就是手柄的中心圆球其移动的是50到100的可移动范围。而当启动千里眼状态时, 游戏界面将会增加一个控制摄像机前后左右移动的界面。玩家可以变旋转摄像机边移动摄像机的位置。
3.7 游戏数据配置与刷新的实现
游戏数据存储在XML表中, 而数据的提取刷新也是在XML表中进行的, 而提取出来的一条Item数据将被存储在Dictionary字典里面, 根据键对值的方式进行读取和存储数据, 从而刷新游戏数据。
4 结束语
本文着重介绍了基于unity开发的轻量级手机游戏包含主屏幕滑屏, 界面刷新, 技能成长系统, 虚拟杆控制, 场景技能释放, 怪物AI设计等多大功能模块设计及采用的开发技术算法分析, 研究在Unity3D平台下完成游戏关卡, 场景以及功能模块的设计过程, 提出实现Unity3D手机游戏开发采用的核心技术及核心代码, 以供游戏开发技术人员提供解决游戏开发问题的一种新思路。
参考文献
[1]游戏核心算法编程内幕[M].北京希望电子出版社, 2005.
[2]游戏发展现状分析报告:86讯息网.
[3]SIKI Unity教程:泰课网.
Unity3D技术 第8篇
随着社会的科技水平和经济水平的迅速发展, 游戏行业以迅雷不及掩耳之势快速的发展着。现在的游戏行业和电影行业可以说已经站在同一高度, 特别是3D技术的进步使得游戏在人们的日常生活中占据着重要的地位[1,2]。射击游戏是目前最为受欢迎的游戏类型, 它经过许多年的蛰伏和发展, 让玩家有种身临其境的真实感觉, 这种效果使得射击游戏在广大玩家中受到热烈的欢迎。在3D技术如此盛行的今天, 游戏引擎受到的关注也持续高涨, 目前主要的引擎有Big World引擎、Unreal Engine3虚幻引擎、Gamebryo引擎、Unity3D引擎, 它们的代表作分别有《魔兽世界》、《使命召唤3》、《古剑奇谭》、《新仙剑奇侠传OL》。相对于前三种引擎来说, Unity3D是最近几年才流行起来, 但它由于完美的跨平台系统使它迅速的在引擎市场占据了重要的地位。本文将介绍一款以Unity3D为开发平台, 结合C#的第一人称的设计游戏系统, 该系统在保证运行效果的同时, 具有设备要求低, 跨平台性能好, 运行流畅稳定的特点。
2 游戏系统的设计与实现
2.1 游戏系统的整体设计
游戏系统设计主要包含主菜单界面、过渡场景界面和主场景这三大模块组成。其中, 在主菜单界面实现了按钮的点击事件;过渡场景界面实现了场景的异步过渡;主场景是该游戏的主体, 主角和敌人的逻辑都在该场景中实现。游戏的流程图如图1所示。
2.2 游戏主菜单界面的制作
该模块包括按钮的制作和游戏介绍、帮助界面的制作。这两部分是关联在一起, 通过点击对应的按钮来达到对应界面的显示与隐藏。它们的制作主要利用NGUI插件来实现。
(1) 按钮制作
该处按钮主要由UILabel、UIButton和Box Collider组成, 按钮的可点击范围由UILabel和Box Collider来确定。首先定义了四个方法来对应四个按钮相对应的点击事件, 分别为Start Game () 、Introduce Game () 、Game Help () 、Quit Game () , 在每个方法中都必须要对各个界面的的显示与隐藏的布尔值进行设定。在Start Game () 方法中利用了Unity3D提供的一种载入下一个场景的方法即Application.Load Level来实现场景的载入[3]。接下来在每个按钮的UIButton脚本里的On Click里把对应的方法名填进去, 这样点击的时候就会实现对应的方法。
(2) 游戏介绍和帮助界面制作
这两个界面上面都是文字的描述, 主要利用到NGUI中的UILabel来实现。在Text属性里输入需要显示的内容, 设置文字的深度属性。该处使用控件为:
NGUITools.Set Active (start UI, start UI_bool) ;
NGUITools.Set Active (introduce UI, introduce UI_bool) ;
NGUITools.Set Active (game Help UI, game Help UI_bool) ;主要用来处理界面的弹出与隐藏, 即设置它们的值为true或false[4]。
2.3 游戏过渡场景的制作
在Unity3D中最简单是采用Application.Load Level (“SceneName”) 加载场景, 该场景加载是同步的, 适用在场景资源小的游戏, 如果场景资源多的话, 这种方式加载场景的效果达不到用户的体验。所以在本系统中场景采用异步过渡的方式实现的。所谓的异步, 即不影响当前游戏场景的前提下加载新场景资源。这里主要是使用Start Coroutine (协同程序) 和Load Level Async (异步加载关卡) 后台加载场景的方法。在脚本中有Start () 、IEnumerator load Scene () 两个方法, 在第一个方法中用StartCoroutine (load Scene () ) 开启一个线程, 在第二个方法中用:Async Operation async=Application.Load Level Async ("MainScene") ;yield return async;来实现。
场景是由一张Sprite构成背景, 背景上的文字提示用UIL-abel来实现。为了让效果更好可以在Label上面添加一个Tween Alpha脚本, 然后调节它的From和To的值, 这是让文字的透明度在这个范围内变化达到闪烁的效果。
2.4 游戏对象的制作
在该游戏中主要的对象有主角和敌人。对于主角, 实现了移动、武器的使用、其它物品的使用和生命值的加减, 同时在主角的身上应用了碰撞检测和射线检测, 使它能与场景中的其它对象进行交互;对于敌人, 它们有自己的AI, 根据不同情况作出对应的动作, 在它们的身上也应用了碰撞检测[5]。
(1) 主角的制作
主角由摄像机、各种武器的开枪模型、碰撞器和攻击特效组成。
首先主角的移动主要采用以下连个控件:
①Input.Get Axis (“Horizontal”) 来获得横轴的移动;
②Input.Get Axis (“Vertical”) 来获得纵轴的移动;
这样通过键盘上的A、D、W、S键就可以移动主角。这里主角还有奔跑的模式, 即按下Shift键和移动键时就会进入奔跑模式[6]。为了让玩家体验更好, 这里主角的奔跑速度是渐渐变快, 事先设定一个最大的速度, 然后通过判断语句来判断当前的速度是否小于等于最大速度, 如果小于的话就利用speed+=12*Time.delta Time来增加当前的速度, 其中的Time.delta Time是一个时间增量。主角要与场景中的其他物体进行交互所以要为主角添加一个碰撞器。
Unity3D中提供了一种射线检测的方法:Physice.Raycast (射线起始点, 射线方向, 射线长度, 层蒙板) , 这里主角捡起武器就是利用此方法来完成, 但要改变武器的Tag。通过定义一个bool型的变量have Weapon来标志主角是否持有该武器, 如果是true的话, 就把该武器的动画模型设为可见即拥有该武器, 否则为不可见[7]。当主角身上的武器超过一种时可用Input.Component.mouse Wheel来切换武器, 然后用for循环来遍历武器, 同时利用Start Coroutine () 来开启一个线程。用以下代码来实现:
主角的开枪, 用Input.Get Button Down (“Fire1”) 来控制, 当按下鼠标左键时实例化一个子弹。子弹的发射也是利用射线检测来实现, 当子弹发射出去的时候, 根据打到物体的身上的碰撞器来获得该物体的Layer, 进而根据它来判断是打到什么物体从而做出相对的动作。枪口的的火花和烟雾特效都是预制体, 在没开枪的情况下它们的Active值为false, 当开枪时值为true, 这样就实现了枪口的特效, 代码如下:
同时主角也可以扔掉身上的武器, 这里用Drop Weapon (int weapon) 方法来处理, 它传入一个当前使用的武器的索引值。用一个布尔型变量have Weapon来判断是否拥有该武器, 当值为false时就可以扔掉该武器。
(2) 敌人的制作
这里敌人的巡逻用了Auto Way Point来实现, 先在场景中放置几个空物体标签设为W, 敌人会在这几个点之间来回走动。定义一个数组来存储这几个点以便实现敌人的巡逻即Auto Way Point[]waypoints Obj[8]。敌人是通过比较waypoint的距离来走向下一个位置的, 代码如下所示:
当主角离敌人的距离小于设定的的距离时敌人会朝着主角追击并射击, 判断距离的控件为
target Distance=Vector3.Distance (my Transform.position, target.position)
。如果主角不在敌人的正前方时敌人会通过转身来使自己朝向主角, 所以用my Transform.rotation=Quaternion.Slerp () 来达到平滑的转身效果, 同时用my Transform.euler Angles=new Vector3 () 来设置旋转角度。
敌人的伤害判定和主角是一样的, 只不过敌人生命值的减少与主角使用的武器有关。
2.5 其它方面的制作
为了让游戏的效果更真实, 当子弹打到不同物体上时会在物体的表面上留下不同的弹孔, 这里是利用射线检测然后根据物体的Layer来判断是什么物体从而在子弹打到的位置实例一张弹孔贴图。
游戏界面显示主角生命值和子弹数量的UI用的是Unity3D自带的GUI来制作的。这里主要用到了如下几个方法:
①gui Text.material.color;设置颜色;
②gui Text.font Size;设置字体的大小;
③gui Text.text;要显示的文字;
游戏中声音的播放必须添加Audio Source组件, 然后在程序中可以利用audio.Play () 来控制播放。
3 结束语
本文从游戏的开始界面、过渡界面到游戏对象等几个模块的设计来介绍利用Unity3D引擎并结合C#来开发一款简单的射击游戏。游戏中包含了几个常用的重点技术, 如射线检测、碰撞检测、敌人的AI等。它基本实现了一般的游戏功能, 同时它的可扩展性还很高, 可以在此基础上另外添加一些比较有创意的设计使该游戏更加的完整。
摘要:本文针对游戏开发技术不断进步, 各类游戏引擎不断更新的情况, 利用Unity3D跨平台功能的突出、兼容性强的特点, 结合C#开发一款第一人称的射击游戏系统, 该系统运行流畅, 具有较好的可玩性与夸平台性。
关键词:Unity3D,射击游戏,游戏引擎
参考文献
[1]宣雨松.Unity3D游戏开发[M].北京:人民邮电出版社, 2012:65-86.
[2]Unity Technologies.Unity 4.X从入门到精通[M].北京:中国铁道出版社, 2013:125-148.
[3] (美) 里伯提 (Liberty, J.) 著;刘基诚, 李愈胜, 刘卫卫译.Programming C#中文版[M]北京:电子出版社, 2007:201-225.
[4]吴亚峰, 于复兴.Unity 3D游戏开发技术详解与典型案例[M].人民邮电出版社, 2012:80-120.
[5]胡俊.游戏开发中的人工智能研究与应用[D].成都:电子科技大学, 2007:25-29.
[6]房晓溪.游戏引擎教程[M].中国水利水电出版社, 2008:30-40.
[7]梅纳德.Unity游戏开发实战[M].机械工业出版社, 2012:192-205.
Unity3D技术 第9篇
1 三维仿真建模
三维仿真模型的好坏直接影响虚拟场景的运行速度和逼真度,若能获取拟建模物体的详细图纸或精确尺寸,则应首选Pro/E、UG等参数化建模软件进行三维零件建模和虚拟装配,然后再使用3ds Max进行模型微调、贴图和动画制作等。因项目组没有找到自动扶梯的详细图纸且难以精确测量其尺寸,因此直接采用3ds Max进行三维零件建模,先后完成自动扶梯的梯级、扶手、导轨、传动系统等零部件的建模,然后再结合镜像、阵列等功能完成虚拟零部件的装配。
需要特别注意的是,在使用3ds Max进行零件建模时,一定要勾选模型的“背面消隐”属性,否则在Unity3D进行虚拟仿真展示时,将无法正常显示。
为获得逼真的展示效果,需采用3ds Max及相关渲染器对三维仿真模型进行渲染和贴图,尤其要注意相关金属材质、橡胶材质和玻璃材质的设计。
在完成零部件的装配及贴图渲染后,还需要在3ds Max中对自动扶梯三维模型零部件进行分组和重命名,并成组后的零部件进行坐标轴调节。为了保证Unity3D虚拟仿真展示的效率,还要对模型面数进行优化。
2 Unity3D虚拟仿真设计
2.1 虚拟场景设计
为了将模型导入到Unity3D虚拟场景中,需要将3ds Max中创建的自动扶梯三维模型连同材质一起导出为.FBX格式文件,并将该.FBX文件拷贝到Unity3D的资源文件夹Assets中,再次激活Unity3D主程序即可完成模型的自动导入。当将模型导入到Unity3D中后,若发现虚拟场景中的三维模型存在破面、面闪烁、材质丢失等问题时,需返回到3ds Max中对模型进行修改完善,经过多次反复后,才能获得满意的模型。将修改完善后的自动扶梯三维模型由Unity3D主程序的Assets窗口拖动到Scene窗口中即可将其添加到在虚拟场景中,然后再对其进行缩放、移动、旋转、显示隐藏等相关属性的设置,最后在场景中添加主摄像机和灯光等其他元素,并进行相关属性和从属关系的设置,即可完成虚拟场景的基本设计。
2.2 虚拟交互脚本设计。
Unity3D支持使用C#、Java Script等多种脚本语言进行交互式动画的开发。首先,使用C#语言编写了Mouse View.cs交互式脚本实现虚拟场景中自动扶梯的多视角展示。同时,需在虚拟场景中添加cube并更名为center_aixs,将其放置到自动扶梯的中心位置,并将Mouse View.cs赋予主摄像机,其观察目标设定为center_aixs,即可实现对自动扶梯进行鼠标拖动旋转和滚轮缩放的多视角展示。
为了对自动扶梯的各部分结构和工作原理进行清晰展示,使用C#语言编写了Virtual Display.cs脚本。该脚本通过添加相应的“显示隐藏零部件”按钮和“工作原理展示”按钮来实现自动扶梯的对应零部件显示隐藏和工作过程展示。在工作过程展示中,通过Lerp()函数实现了梯级、扶手、导轨等零部件的运动补间动画。交互式虚拟展示效果如图1所示。
3 总结
针对自动扶梯在内部结构展示和工作原理学习等方面的需求,深入研究了Unity3D虚拟交互技术,设计并实现了自动扶梯虚拟仿真在线教学平台。该平台动态教学展示效果好、逼真度高,对学生及维修人员学习自动扶梯的内部结构和工作原理,掌握自动电梯维修和保养知识具有一定的应用价值。
摘要:针对自动扶梯在内部结构展示和工作原理学习等教学方面的需求,基于Unity3D虚拟现实软件,设计并实现了自动扶梯虚拟仿真教学Web平台,对自动扶梯的内部结构和工作原理进行在线展示。该平台使用C#脚本语言开发交互程序,实现虚拟场景中零部件的显示隐藏和多角度观察,交互性强,动态展示效果好。
Unity3D技术 第10篇
在组织竞赛过程中,普遍存在方案制定繁琐复杂、前期预演效率低下、人员组织协调难度大等诸多问题。因此,竞赛组织者迫切需要一种能够辅助其进行竞赛组织的工具。为解决以上问题,以通信类专业竞赛为切入点,该文提出“基于Unity3D的通信专业竞赛流程模拟演练系统”。Unity3D是一款专业3D引攀,具备跨平台发布、高效能优化、高性价比、AAA级画面渲染效果等特点。该引擎最大的优势是性价比高,并且可以发布成网页浏览的方式,不用下载客户端,就能直接体验[1]。该文所提出的通信专业竞赛流程模拟演练系统即基于该引擎开发。
1 系统的目标功能
1.1 可视化竞赛现场布置功能
改变以往“现场看、脑子想、纸上画”的场地布置方式,为竞赛组织者呈现三维可视化的竞赛现场,将竞赛所需器材设备用品等分门别类作为竞赛现场布置基本模块单元,使组织者可采用拖拽的形式进行竞赛场地可视化布置。同时,组织者可对布置的基本模块进行属性信息编辑,明确人员分工、对外协调和时间节点等信息,存入后台数据库,待实时查看最终效果且满意后,可将完整的场地布置信息报表输出。
1.2 竞赛流程模拟演练功能
改变以往大规模人员调动困难、组织协调复杂等竞赛前期模拟演练存在的问题,以竞赛时间轴为主线,在可视化竞赛现场的基础上,根据竞赛方案设定各时间节点人员位置编排、任务分工、行进路线、行进速率、到达时间等信息,先期在计算机上进行整个竞赛流程模拟演练,及时发现存在的问题,为进一步修改完善方案提供依据。待模拟演练效果满意后,可召集竞赛组人员在竞赛前期准备协调会期间进行流程展示宣讲[2]。
2 总体方案设计
2.1 系统总体构成
“通信专业竞赛流程模拟演练系统”由可视化场地布置和流程模拟演练两大模块构成,总体构成见图1。其中,可视化场地布置模块由三维场景生成、竞赛场地布置、场地方案报表生成等子模块组成。流程模拟演练模块由节点设定、模拟演练和流程方案报表生成等子模块组成。
2.2 主要模块
“通信专业竞赛流程模拟演练系统”主要用于通信专业竞赛场地可视化布置,辅助竞赛组织者进行前期方案制定,并根据方案要求进行前期竞赛流程的模拟演练,以便于即时发现方案制定中存在的问题,从而有效提高竞赛组织效率。
1)可视化场地布置
该功能模块主要包含“三维场景生成”、“竞赛场地布置”、“场地方案报表生成”三个子模块。“三维场景生成”模块可实现通信专业竞赛场地的三维场景生成,为后续功能模块提供基础平台,这是整个系统可视化的基础;“竞赛场地布置”模块通过前期分析, 将装设备、电脑、打印机、桌椅、标牌、横幅、指示牌等竞赛过程中所需器材设备用品等分别归类,生成竞赛用品布置基本模块单元库,基于前期生成的可视化三维竞赛场景,组织者可采用拖拽的形式进行竞赛场地可视化布置,实时查看最终效果。同时,组织者可对布置的基本模块进行属性信息编辑,明确人员分工、对外协调和时间节点等信息,存入后台数据库。在与竞赛组人员进行沟通交流的过程中,若发现不适宜之处,可及时修改相应属性信息,使方案更进一步趋于完善;在“场地方案报表生成”模块中组织者在竞赛场地布置完成查看最终效果且满意后,可将完整的场地布置信息报表按预定需求输出打印,方便查看。
2)流程模拟演练
该功能模块主要包含“节点设定”、“模拟演练”和“流程方案报表生成”三个子模块。“节点设定”模块以竞赛总体方案为依据, 以竞赛时间轴为主线,在可视化三维竞赛场景的基础上,竞赛组织者可设定各时间节点人员的位置编排、任务分工、行进路线、速率等信息,并存入后台数据库;“模拟演练”模块在节点设定的基础上,竞赛组织者先期在计算机上进行整个竞赛流程的模拟演练, 及时发现存在的问题并修改节点设定,使方案更进一步趋于完善;“流程方案报表生成”模块在流程模拟演练顺利结束后,竞赛组织者可将存于后台数据库中的竞赛流程方案报表输出打印。
3 系统实现
3.1 可视化竞赛现场三维场景生成
可视化竞赛现场通过对先期获得的竞赛现场建筑的CAD图纸进行相应整理,之后导入3dsMax软件实现场景建模。对三维模型的建立,主要依据实际场景本身的物理状态,即具体的大小尺寸,其原则就是在尽量减小面数的同时提高逼真度[3]。
3.2 竞赛场地布置和流程模拟演练
将3dsMax软件生成的可视化竞赛现场三维场景导入Unity3D引擎,在其中进行竞赛场地布置和流程模拟演练功能开发[4]。竞赛场地布置和流程模拟演练所需的大量人机交互功能均在该引擎中设计实现,具体如下:
1)利用刚体碰撞器物理引擎实现场景布置时的定位;
2)利用角色控制器进行视角转换以实现第一人称视角场景检视和第三人称视角流程模拟演练功能;
3)利用键盘鼠标自定义按键等输入控制事件实现人机交互;
4)利用路点功能设置人员行进路径以实现流程模拟演练;
5)利用MySQL实现场景布置信息和节点设定信息的后台数据库存储并报表输出。
3.3 方案报表生成
由于Unity3D本身提供的持久化数据仅能存取少量数据,故本系统采用第三方MySQL数据库存储场地布置方案和流程设定方案信息。MySQL是一个关系型数据库管理系统,相较于SQLServer数据库,其体积小、速度快、总体拥有成本低[5]。
为生成相应方案报表,系统采用MySQL数据库中自带的MySQL For Excel插件实现,该插件作为加载项嵌入Excel软件中,可将MySQL数据库中存储的信息导出至Excel表格中,方便后期打印输出,辅助竞赛组织者进行前期方案生成。
3.4 关键技术实现
1)竞赛场地布置
在真3D环境下进行竞赛场地布置,具有较好的沉浸式真实感。如何实现真3D环境下物品摆放的三维坐标精确控制,是竞赛场地布置功能需要着重解决的问题。为使组织者可采用拖拽的方式进行竞赛场地可视化布置,需要相应的拖拽算法,主要解决如何将鼠标的二维坐标移动转换成三维世界的移动向量,该算法流程如下图2所示。
2)模拟演练
流程模拟演练可鉴定通用塔防游戏的设计思路[6],通过创建二维数组保存场景信息,摄像机始终由上至下俯视整个场景,自定义路径节点引导人员按规定速率行动,并实时记录行动耗时信息。为使路径节点人员能够按设定程序依次有序行进演练,自定义路径节点信息设定完毕后,需要对设定信息进行冲突检测,防止逻辑混乱,出现一人在同一时间分处不同两地的情形。设置人员寻路的流程如图3所示。
4 结束语
本系统初期可满足院校通信类专业竞赛流程模拟演练,使竞赛组织者可进行竞赛场地可视化布置,有效辅助其进行前期方案制定。同时,可依照组织者的需求进行竞赛前期的整体流程模拟演练,以便于即时发现方案制定中存在的问题,从而有效提高竞赛组织效率。此外,该系统具有较好的推广性,结合各院校其它专业竞赛具体要求进行二次开发,即可满足其专业竞赛的模拟演练功能。后期若构建全校的三维模型,可将该系统推广到全校大型活动时的流程模拟演练。
摘要:针对院校各类型专业竞赛逐年增多但竞赛组织效率偏低的现状,基于Unity3D开发了通信专业竞赛流程模拟演练系统。该系统具有三维场景生成、可视化竞赛现场布置、竞赛流程模拟演练和方案报表生成等功能,有效提高了竞赛组织效率,具有广泛的应用前景和较高的推广价值。
Unity3D技术
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。