正在播放强奷女交警电影_ 〖名卿巨公〗-新蔡建设局
淘宝减肥药排行榜十强
只推淘宝安全有效的减肥药

当前位置:正在播放强奷女交警电影 > 减肥产品

正在播放强奷女交警电影

时间:2020-10-26 00:40  当雄农村信用社发布

计算机游戏程序设计实验1-4报告

实验一 GUI游戏界面的实现

一、实验目的与要求

1. 熟悉及掌握GUI的高级控件,以及用法。

2. 掌握GUI自定义皮肤用法

3. 熟悉GUILayout的使用。

4. 熟悉2D贴图的绘制和帧动画的实现方法。

二、实验原理及知识点

在游戏的整个开发过程中,游戏界面设计占据非常重要的地位。因为游戏启动后,第一个映入玩家眼帘的就是游戏的UI界面。UI界面主要包括贴图,按钮和高级控件等。通常游戏界面的展现方式有很多种,大多数都由自定义图形界面组成。

Unity为开发者提供了一套非常完善的图形化界面引擎,它包括常见的游戏窗口、文本框、输入框、拖动条、按钮、贴图框等,无论是做软件还是做游戏,都可以很方便地使用。

另外,Unity提供了界面自定义皮肤的功能。控件不仅可以使用默认的皮肤,还可以自定义皮肤,自定义皮肤不仅可以美化游戏界面,还可以提升游戏品质。Unity游戏界面主要由GUI完成。在本章中,我们将使用JavaScript脚本向读者详细介绍Unity中有关GUI界面的所有高级控件。

1. GUI高级控件

系统高级UI控件已经成为游戏开发中不可缺少的一部分,高级界面由系统提供,所以运行效率要远远高于低级界面(高级界面为系统实现,低级界面为自己手动实现)。拿按钮控件来说吧,不使用系统提供的按钮控件,我们也可以使用低级界面模拟实现按钮的功能。不过,低级界面实现的“按钮”没有高级界面实现的效率高,但是低级界面制作的“按钮”比较灵活,可以任意修改。

GUI高级控件的种类非常繁多,包括标签、按钮、输入框和拖动条等。他们可用于任何游戏或软件的界面研发。GUI高级控件的应用也非常广泛,比如网络游戏中输入账号与密码的提示框,通关游戏后上传游戏积分的按钮,创建角色时输入的角色信息等。下面将分别向读者介绍GUI高级控件的相关用法。

1.1 Label控件

使用Label控件(标签控件),可以在游戏界面中以文本的形式展示出一段字符串信息。使用Label控件,我们不仅可以输入字符串,还可以贴图。

1.2 Button控件

在开发中,Button控件(按钮控件)是十分常见的控件之一,可以用来判断用户在程序中的一些操作行为,比如对话框中的“确定”和“取消”按钮。

按钮共有3个基本状态组成:未点击状态、击中状态、点击后状态。一般情况下,游戏界面的按钮只监听“未点击状态”和“点击后状态”。

按照展现方式,按钮可以分为两种:“普通按钮”和“图片按钮”。普通按钮为系统默认显示的按钮,而图片按钮可以设定按钮的背景图案。

1.3 TextField控件

TextField控件主要用于监听用户输入的信息,其应用非常普遍,比如在游戏登陆界面中,玩家输入用户名和密码后,点击“确认”按钮判断其输入是否正确,或者游戏通关后填写胜利者姓名与输入相关的游戏信息等。

一般情况下,使用GUI.TextField()方法显示输入框,该方法的返回值为用户输入的字符串信息。使用GUI.PasswordField()方法,可以将用户输入的信息显示为任意字符串,一般在输入密码时将密码以“****”的形式显示。后面的参数“*”【0】用来将输入的字符串显示为“*****”。

1.4 Slider控件

Slider控件由滑块和滑动条组成。使用Slider控件,可以计算出滑块在滑动过程中占整个滑动条的比例。如果滑动条的整体长度为100,则滑块滑动的范围就是0至100 。

按照展示方式,滑动条可分为两种:一种为水平滑动条(HorizontalSlider),另一种为垂直滑动条(VerticalSlider),它们之间的用法完全相同。

在开发中,我们常使用滑动条来调节音量或者颜色等。

1.5 ScrollView控件

如果游戏界面中的GUI控件过多,超出了屏幕的显示范围,就需要使用ScrollView控件来完成它的展示效果。

ScrollView控件可设定一个滚动显示区域。如果横向或纵向的GUI控件超出了其显示区域。视图下方或者右方将会出现滚动条。在开发中使用ScrollView控件的情况非常普遍,比如如果游戏中帮助信息或者关于信息过长,就可以使用滚动条来查看相关信息。

1.6 群组控件(GroupView控件)

群组视图(GroupView控件)可将多个视图全部放在一个群组当中。将视图添加进群组当中后,群组中任何视图的坐标都是相对坐标,它是相对群组视图左上角的坐标。

修改群组视图坐标后,群组中所有视图的坐标都会跟着修改。推荐使用群组视图来制作游戏界面,因为设备的屏幕尺寸不同,这样做可以避免对坐标进行多次修改的麻烦。

1.7 窗口

窗口在游戏开发中并不陌生,所有视图都需要依赖窗口来显示,我们可以把窗口理解为视图的父类。前面我们介绍了各式各样的游戏视图,它们都属于窗口的子类。游戏界面可以由若干个窗口组成,窗口又由若干个视图组成。

创建窗口时需要设定它的显示区域,在窗口中可以添加任意组件,前提是组件的显示区域必须在窗口当中,否则无法显示。另外,窗口中所有控件的坐标均采取相对坐标,相对窗口左上角的坐标。

1.9 GUI Skin

通过之前章节的学习,我想大家已经掌握了Unity大部分的GUI控件,但是直接使用这些控件开发游戏还远远不够,因为系统默认的界面实在过于粗糙与单调。为了让自己的游戏界面活灵活现,我们需要使用GUI Skin为控件添加一个漂亮的皮肤。

2 GUILayout游戏界面布局

游戏界面的制作效果有很多中,有复杂绚丽的界面,也有简单明了的界面,而设计方式的仁者见仁,智者见智。在跨平台游戏界面开发中,最麻烦的事就是各个平台的分辨率不一样,甚至相同平台的分辨率也不一样,这无疑给移植造成非常大的麻烦。因此,在制作游戏界面时,使用绝对坐标值是相当危险的一件事。因为如果跨平台移植的话,分辨率发生了改变,开发者就得为其重新设计坐标,这在开发效率上将大打折扣。为了避免后期对坐标重新进行计算,前期制作界面时可以考虑自适应屏幕布局,GUI为开发者提供了游戏布局的概念,并且在布局的过程中所有的坐标点都是对称坐标,所以使用GUI游戏界面布局来制作界面将更有效地实现自适应屏幕。

2.1 GUI与GUILayout的区别

通过之前的学习,我相信大家对GUI应该并不陌生了,那么GUILayout 是什么东西呢?它是游戏界面的布局。从命名中就可以看到这两个东西非常相像,但是在使用过程中两者还是存在一定区别的。

使用GUI绘制控件的时候,需要设置控件的Rect()方法,也就是说需要设定控件的整体显示区域。这样设置的控件非常不灵活,因为它的坐标以及大小已经固定死了,这是如果控件中的内容长度发生改变,就会直接影响展示效果。例如,在界面中绘制一个按钮时,按钮中的显示文本刚好填充在整个按钮当中,如果动态加长文本的显示长度,就会超出按钮的显示范围,使按钮控件变得不伦不类。我们需要制作控件的自适应,所以不能使用Rect ()方法固定控件的显示区域,而是需要使用界面布局制作界面。

使用GUILayout来制作界面,可以很方便的为我们解决上述难题。使用GUI制作界面的时候,需要给每一个控件设定显示区域,系统会自动帮我们计算控件的显示区域,并且保证他们不会重合。(注意之前介绍的大部分GUI 控件都可以使用GUILayout进行绘制)

2.2 线性布局

线性布局是以线性连续排列的形式将GUI控件有规律的显示在屏幕中,共分为两种:一种为水平线性布局,另一种为垂直线性布局。默认的界面是以垂直线性布局的方式来排列。

创建水平线性布局时,首先需要使用BeginHorizontal()方法,然后将控件添加至线性布局当中,最后使用EndHorizontal()方法来结束当前线性布局。而如果使用垂直线性布局,则需要使用BeginVertical()方法与EndVertical()方法。

无论是水平线性布局还是垂直线性布局,都可以使用嵌套的形式来制作游戏界面,也就是说,父类布局中可以继续嵌套一个子类布局,子类布局完全受父类布局的限制。善用布局之间的嵌套,可以方便我们制作更为复杂的游戏界面。

2.3 控件偏移

布局与布局之间都是以一种线性方式紧密排列的,无法直接修改布局当中两个相连控件的距离,为了解决这个问题,就需要使用空间偏移。

在控件中使用Space()方法可以设置控件之间的偏移量。

3 2D贴图与帧动画

2D贴图好比在屏幕中绘制了一张静态图片,其绘制方式有两种,第一种由GUI绘制,第二种是将贴图以材质的形式绘制在游戏对象中,在本节中,我们将着重介绍第一种方式。

帧动画的实现原理就是使用若干张静态图片以一定的时间一帧一帧地在屏幕中切换播放,好比在屏幕中预先设定一个现实动画的区域。然后将图片在这个现实区域中频繁切换播放。由于绘制的图片有规律的切换播放,给人们带来了视觉的假象,感觉就像播放动画一样。

3.1 绘制贴图

要在屏幕中绘制一张静态贴图,需要使用GUI.DrawTextture()方法,该方法可设定图片的显示位置、缩放比例和渲染混合等,该方法的原型如下:其中第一个参数表示图片的绘制区域,第二个参数表示绘制图片的图像,第3个参数表示图片的缩放模式,第四个参数表示的是否开启图片混合模式,第五个参数表示图片缩放宽高的比例。

在Project视图中将需要加载的图片存储在根目录“Resources”中。需要说明的是,一定要将加载的图片保存在“Resources”文件夹中,否则程序将无法识别。Resources.Load()方法和Resources.LoadAll()方法的参数均为资源文件夹的完整路径,只不过前者返回的事读取的资源对象,后者返回的是资源对象的数组。

3.2绘制动画

本节中我们开始学习帧动画的绘制。首先需要一组帧动画的资源,在这里我们选择一套2D人物四宫格行走图,在绘制帧动画之前,我们需要学习帧动画的绘制原理:首先需要在屏幕中设定一个显示区域,然后将动画中的

每一个帧动画按照固定的时间在这个区域中按顺序切换,继而实现动画的播放。

这里我们使用程序将动画资源存储在动画数组当中,然后设定动画的刷新时间,每次刷新动画时将在原有的显示区域中绘制下一帧图片,到了最后一帧则从第一帧重新开始,以此类推你。

3.3实例——人物移动

结合2D帧动画的绘制原理,本节我们将制作一个游戏实例,效果如图3.4所示。在屏幕中共绘制了四个按钮,通过点击这四个按钮来控制主角的移动,并且播放主角在对应方向上的行走的动画。

程序需要监听用户出发的按钮来切换动画方向,比如当用户点击“向上”按钮时,将播放主角向上走的动画。

我们使用x、y全局变量来记录当前主角的坐标,上下行走为加减x坐标,左右行走为加减y坐标,最后根据主角的x、y坐标来绘制但前动画在屏幕中的位置,从而实现控制主角向四个方向行走。

4本部分内容小结

本部分首先介绍了Unity中GUI界面的相关组件以及自定义皮肤的实现方式,其中每一个GUI高级组件都配备了一个小例子供读者学习;然后介绍了GUI与GUILayout的区别,已介入和使用GUILayout布局来制作界面;接着介绍了使用GUI绘制2D贴图与动画,以及如何控制主角移动的游戏实例;最后通过制作一个游戏主界面,回顾了前面所学的游戏界面的相关内容。请大家认真阅读本章内容,打好游戏界面设计的基础,为后面深入学习做好准备。

三、实验内容及步骤

1. 熟悉GUI高级控件,练习使用GUI的高级控件制作2~3个游戏界面。

2. 练习使用GUI自定义皮肤,实现游戏界面的字体,背景颜色等设置。

3. 熟悉GUILayout的使用,联系使用GUILayout的水平线性布局和垂直线性布局,并加适当偏移。

4. 熟悉2D贴图的绘制和帧动画的实现方法,练习在界面中绘制静态图片和动画。

代码如下:

#pragma strict

var str:String;

var mm:String;

function Start () {}

function Update () {}

function OnGUI(){

GUI.BeginGroup(Rect(Screen.width/2-150,Screen.height/2-100,400,300));

GUI.Label(Rect(20,20,80,30),"菜单:");

if(GUI.Button(Rect(100,40,60,20),"自动漫游")){

Application.LoadLevel("自动漫游");

}

if(GUI.Button(Rect(100,10,60,20),"音频播放")){

Application.LoadLevel("音频播放");

}

if(GUI.Button(Rect(100,70,60,20),"画线")){

Application.LoadLevel("画线");

}

if(GUI.Button(Rect(100,100,60,20),"视频播放")){

Application.LoadLevel("视频播放");

}

GUI.EndGroup();

}

实验二Unity游戏脚本

一、实验目的与要求

1. 熟悉及掌握MonoDevelop脚本编辑器的使用方法。

2. Unity脚本的生命周期。

3. 熟练使用脚本来操作游戏对象。

二、实验原理及知识点

Unity游戏脚本在整个游戏开发中可以说是关键要素,游戏对象之间任何逻辑的判断都需要通过脚本来完成。如果说游戏贴图、模型资源的好坏决定一个游戏的视觉品味,那么脚本将直接决定这个游戏的内在质量,决定这个游戏好玩与否。游戏脚本与其他游戏组件用法相同,必须绑定在游戏对象中才能执行它的生命周期。

Unity一共支持3种语言来编写脚本,分别是JavaScript、C#、Boo,这3种语言不分好坏,用哪一种来编写都可以达到同样目的。从编程技巧与难度上来讲,JavaScript更容易上手一些,建议初学者使用JavaScript进行入门阶段学习,但是进阶阶段推荐使用C#语言来编写脚本,因为C#语言

在编程思想上更符合Unity引擎的原理。由于与传统语言相比,Boo语言的

语法更为怪异,所以开发中几乎不会用到它。

1 MonoDevelop脚本编辑器

Unity可部署在Windows与Mac OS X梁总操作系统下,所以Unity需要一个跨平台的脚本编辑器。MonoDevelop脚本编辑器并不是Unity公司所研发的。它是一个开源项目,任何人或公司都可以使用。由于该编辑器具有强大的跨平台功能,并且使用起来非常方便,所以很快被Unity公司作为核心脚本开发环境使用。

2 Unity脚本的生命周期

Unity脚本从唤醒到销毁有着一套比较完善的生命周期,添加任何脚本都必须遵守自身生命周期法则。下面介绍一下生命周期中有系统自身调用的几个比较重要的方法。

function Awake(){}。脚本唤醒,此方法为系统执行的第一个方法,用于脚本的初始化,在脚本的生命周期中只执行一次。

function Start(){}。此方法在Awake()方法之后、Update()方法之前执行,并且只执行一次。

function Update(){}。正常更新,用于更新逻辑。此方法每帧都会由系统自动调用一次。

function LateUpdate(){}。推迟更新,此方法在Update()方法执行完后调用,同样每一帧都调用。

function FixedUpdate(){}。固定更新,固定更新常用于移动模型等操作。因为固定更新每一帧调用的时间相隔都是完全一样的,所以模型的移动过程会比较均匀。

function OnGUI(){}。绘制界面。这个方法大家应该不会陌生,因为在第3章中已经做过很多例子了。它和Update()方法一样,每一帧都在调用,只是它是用来绘制界面的。

function OnDestroy(){}。当前脚本销毁时调用。

3利用脚本来操作游戏对象

在Unity场景中出现的所有实体都属于游戏对象,比如系统自带的立方体、球体以及由美工制作的.Fbx游戏模型等。游戏对象与脚本联系非常紧密,因为游戏对象之间的一切交互都需要使用脚本来完成。

下面我们开始学习如何使用脚本来操作游戏对象。使用脚本来调用游戏对象的方式有两种,它们是:可以将脚本绑定在一个游戏对象身上,也可以在代码中动态绑定脚本和删除脚本。任何一个游戏对象都可以同时绑定多条游戏脚本,并且这些脚本互不干涉,各自完成各自的生命周期。

3.1 创建游戏对象

创建游戏对象的方式共有一下两种。第一种为将模型预先放入Hierarchy视图中,然后在场景视图中任意拖动该模型在3D世界中的位置,运行游戏后该模型就会出现在Game视图中。第二种为在代码中根据条件动态创建与删除游戏对象,这种处理方式灵活性比较高。

3.2 获取游戏对象

在脚本中获取游戏对象的方式一共有三种:第一种为通过对象名称获取,第二种为通过标签(tag)获取单个游戏对象,第三种为通过相同标签获取多组游戏对象。

3.3 添加组件与修改组件

新创建的游戏对象本身并不具备任何特性,为了让它具备一些功能,就必须给其添加游戏组件。游戏组件的种类非常多,常见的游戏组件有脚本类、网格类、粒子类、物理类、声音类和渲染类等。本节中我们将学习如何在代码中添加与修改游戏组件。添加游戏组件时,可以使用AddComponent()方法。由于组件自身没有对应的删除方法,需要使用父类执行Object.Destroy()方法才能删除它,其中该方法的参数为需要删除的游戏对

象或游戏组件。在删除某一游戏对象时,将连带该对象中的所有组件一并删除。

3.4 克隆游戏对象

克隆游戏对象与创建游戏对象在效果的呈现方式是完全一样的,但是从执行效率上来讲,克隆游戏对象的效率要高。使用脚本克隆游戏对象在游戏中应用非常广泛,常用于一些完全相同并且数量庞大的游戏对象,比如游戏中发射的子弹对象,每一颗子弹对象是完全一样的,每一次发射子弹都会新克隆一个子弹对象,并且让克隆的子弹对象完成自己的生命周期。在代码中,需要使用Instantiate()方法克隆游戏对象。

4 用脚本来控制对象的变换

在3D世界中,任何一个游戏对象在创建的时候都会附带Transform(变换)组建,并且该组建是无法删除的。

Transform面板中一共包含3个属性:Position(位置)、Rotation(旋转)和Scale(缩放)。在场景中使用移动工具来拖动和旋转模型,即可直接在Transform面板中看到编辑后的值,此外也可在Transform面板的编辑框中修改对象的位置、旋转方式和缩放的数值。

4.1 改变游戏对象的位置

在3D世界中,任何一个模型的三维坐标都保存在Vector3容器中,该容器将记录模型在x轴、y轴和z轴方向的坐标。一旦在程序中修改该模型在Vector3容器中的坐标,那么Scene视图中模型的位置将发生改变。

4.2 旋转游戏对象

模型的旋转方式可分为2种:第一种为自身旋转,意思是模型沿着自己的x轴,y轴或z轴方向旋转;第二种为围绕旋转,意思是模型围绕着坐标系中的抹一点或摸一个游戏对象整体来做旋转。

下面简要介绍一下经常会用到的一些重要方法和参数。

transform.Rotate():该方法用于设置模型绕自身旋转,起参数为旋转的速度与旋转的方向。

transform.RRotateAround():该方法用于设置模型围绕某一个点旋转。

Time.deltaTime:用于记录上一帧所消耗的时间,这里用作模型旋转的速度系数。

Vector3.right:x轴方向。

Vector3.up:y轴方向。

Vector3.forward:z轴方向。

当模型绕自身旋转时,可以使用objCube.transform.Rotate()方法,当模型围绕抹一点旋转时,则使用objCube.transform.RotateAround()方法。

4.3 平移游戏对象

平移的含义是模型在原有位置的基础上继续移动,在代码中可以使用transform.Translate()方法来实现,此方法的唯一参数为平移模型的方向。

4.4 缩放游戏对象

在Unity中,可以通过代码动态缩放游戏中的模型。主要有三种缩放方式:沿x轴缩放、沿y轴缩放、沿z轴缩放。每个轴都有自身的缩放洗漱,模型默认的缩放系数是1,就是模型原有大小,因此要在程序中实现模型的缩放,只需要动态修改模型的缩放系数即可。

三、实验内容及步骤

1. 熟悉MonoDevelop脚本编辑器的使用方法,联系实现脚本调试。

设置默认脚本的打开方式:

脚本调试:

2. 编程实现创建游戏对象(立方体,球体),给游戏对象命名,改变颜色,添加刚体组件。

源代码:

using UnityEngine;

using System.Collections;

public class duixiang : MonoBehaviour {

// Use this for initialization

void Start () {

}

// Update is called once per frame

void Update () {

}

void OnGUI(){

if(GUILayout.Button("创建立方体",GUILayout.Height(50)))

{

GameObject

objCube=GameObject.CreatePrimitive(PrimitiveType.Cube);

objCube.AddComponent<Rigidbody>();

objCube.name="Cube";

objCube.renderer.material.color=Color.blue;

objCube.transform.position=new Vector3(0.0f,10.0f,0.0f);

}

if(GUILayout.Button("创建球体",GUILayout.Height(50)))

{

GameObject

objSphere=GameObject.CreatePrimitive(PrimitiveType.Sphere);

objSphere.AddComponent<Rigidbody>();

objSphere.name="Sphere";

objSphere.renderer.material.color=Color.red;

objSphere.transform.position=new Vector3(0.0f,10.0f,0.0f);

}

}

}

3. 分别通过名称、标签获得游戏对象,通过标签获得多个游戏对象。通过名称:

源代码:

public class find : MonoBehaviour {

private GameObject objCube;

private GameObject objSphere;

private bool isCubeRoate=false;

private bool isSphereRoate=false;

private string CubeInfo="旋转立方体";

private string SphereInfo="旋转球体";

// Use this for initialization

void Start () {

objCube=GameObject.Find("Cube");

objSphere=GameObject.Find("Sphere");

}

// Update is called once per frame

void Update () {

if(isCubeRoate)

{

if(objCube)

{

objCube.transform.Rotate(0.0f,Time.deltaTime*200,0.0f);

}

}

if(isSphereRoate)

{

if(objSphere)

{

objSphere.transform.Rotate(0.0f,Time.deltaTime*200,0.0f);

}

}

}

void OnGUI(){

if(GUILayout.Button(CubeInfo,GUILayout.Height(50)))

{

if(!isCubeRoate)

{

isCubeRoate = true;

CubeInfo = "停止旋转立方体";

}

else

{

isCubeRoate = false;

CubeInfo = "旋转立方体";

}

}

if(GUILayout.Button(SphereInfo,GUILayout.Height(50)))

{

if(!isSphereRoate)

{

isSphereRoate = true;

SphereInfo = "停止旋转球体";

}

else

{

isSphereRoate = false;

SphereInfo = "旋转球体";

}

}

if(GUILayout.Button("立即销毁模型",GUILayout.Height(50)))

{

Destroy (objCube);

Destroy (objSphere);

}

}

}

通过标签:

源代码

using UnityEngine;

using System.Collections;

public class find : MonoBehaviour {

private GameObject objCube;

private GameObject objSphere;

private bool isCubeRoate=false;

private bool isSphereRoate=false;

private string CubeInfo="旋转立方体";

private string SphereInfo="旋转球体";

// Use this for initialization

void Start () {

objCube=GameObject.FindWithTag("MyTag");

objSphere=GameObject.Find("Sphere");

}

// Update is called once per frame

void Update () {

if(isCubeRoate)

{

if(objCube)

{

objCube.transform.Rotate(0.0f,Time.deltaTime*200,0.0f);

}

}

if(isSphereRoate)

{

if(objSphere)

{

objSphere.transform.Rotate(0.0f,Time.deltaTime*200,0.0f);

}

}

}

void OnGUI(){

if(GUILayout.Button(CubeInfo,GUILayout.Height(50)))

{

if(!isCubeRoate)

{

isCubeRoate = true;

CubeInfo = "停止旋转立方体";

}

else

{

isCubeRoate = false;

CubeInfo = "旋转立方体";

}

}

if(GUILayout.Button(SphereInfo,GUILayout.Height(50)))

{

if(!isSphereRoate)

{

isSphereRoate = true;

SphereInfo = "停止旋转球体";

}

else

{

isSphereRoate = false;

SphereInfo = "旋转球体";

}

}

if(GUILayout.Button("立即销毁模型",GUILayout.Height(50)))

{

Destroy (objCube);

Destroy (objSphere);

}

}

}

通过标签获得多个:

function Start ()

{

var objs = GameObject.FindGameObjectsWithTag ("MyTag");

objs[5].tag = "TestTag"

for (var obj in objs)

{

Debug.Log("以"+ obj.tag+"标签为游戏对象的名称"+ obj.name);

if(obj.tag == "TestTag")

{

Debug.Log("这个标签为TestTag");

}

if(obj.CompareTag("TestTag"))

{

Debug.Log("obj这个对象附带的标签为TestTag");

}

}

}

4. 通过脚本控制游戏对象,改变游戏对象的位置,旋转游戏对象,缩放游戏对象。

改变游戏对象的位置:

源代码:

using UnityEngine;

using System.Collections;

public class weizhi : MonoBehaviour {

private float Value_X = 0.0f;

private float Value_Y = 0.0f;

private float Value_Z = 0.0f;

private GameObject obj;

// Use this for initialization

void Start () {

obj = GameObject.Find("Cube");

}

void OnGUI(){

GUILayout.Box("移动立方体x轴");

Value_X = GUILayout.HorizontalSlider(Value_X, -10.0f, 10.0f,GUILayout.Width(200));

GUILayout.Box("移动立方体y轴");

Value_Y = GUILayout.HorizontalSlider(Value_Y, -10.0f, 10.0f,GUILayout.Width(200));

GUILayout.Box("移动立方体z轴");

Value_Z = GUILayout.HorizontalSlider(Value_Z, -10.0f, 10.0f,GUILayout.Width(200));

obj.transform.position = new Vector3(Value_X,Value_Y,Value_Z);

GUILayout.Label("立方体当前位置:" + obj.transform.position);

}

}

旋转游戏对象:

代码:

using UnityEngine;

using System.Collections;

public class xuanzhuan : MonoBehaviour {

private GameObject objCube;

private GameObject objCylinder;

private int speed = 100;

void Start () {

objCube = GameObject.Find("Cube");

objCylinder = GameObject.Find("Cylinder");

}

void OnGUI(){

if(GUILayout.RepeatButton("立方体沿x轴旋转",GUILayout.Height(50)))

{

objCube.transform.Rotate(Vector3.right * Time.deltaTime * speed);

}

if(GUILayout.RepeatButton("立方体沿y轴旋转",GUILayout.Height(50)))

{

objCube.transform.Rotate(Vector3.up * Time.deltaTime * speed);

}

if(GUILayout.RepeatButton("立方体沿z轴旋转",GUILayout.Height(50)))

{

objCube.transform.Rotate(Vector3.forward * Time.deltaTime * speed);

}

if(GUILayout.RepeatButton("立方体围绕圆柱体旋转",GUILayout.Height(50)))

{

objCube.transform.RotateAround(objCylinder.transform.position,Vector3.u p ,Time.deltaTime * speed);

}

GUILayout.Label("立方体旋转角度"+objCube.transform.rotation);

}

}

缩放游戏对象:

代码:

using UnityEngine;

using System.Collections;

public class suofang : MonoBehaviour {

private GameObject obj;

private float scaleX = 1.0f;

private float scaleY = 1.0f;

private float scaleZ = 1.0f;

void Start(){obj=GameObject.Find("Cube");}

void OnGUI(){

GUILayout.Label("X轴缩放");

scaleX=GUILayout.HorizontalSlider(scaleX,1.0f,2.0f,GUILayout.Width(100));

GUILayout.Label("Y轴缩放");

scaleY=GUILayout.HorizontalSlider(scaleY,1.0f,2.0f,GUILayout.Width(100));

GUILayout.Label("Z轴缩放");

scaleZ=GUILayout.HorizontalSlider(scaleZ,1.0f,2.0f,GUILayout.Width(100));

obj.transform.localScale=new Vector3(scaleX,scaleY,scaleZ);

}

}

实验三使用游戏元素

一、实验目的与要求

1. 熟悉及掌握地形元素的使用方法。

2. 熟悉及掌握光源的使用方法。

3. 熟悉及掌握天空盒子的使用方法。

4. 熟悉及掌握摄像机的使用方法。

二、实验原理及知识点

在3D游戏世界中,通常会将很多丰富多彩的游戏元素融合至游戏中。游戏元素是制作游戏的必备条件,它种类繁多并且作用也大不相同。游戏元素可分为常用元素与不常用元素两种,常用元素是游戏中一些比较重要的元素,它们需要使用脚本来实现一些特殊功能,比如玩家控制的主角对象、需要攻击的敌人、通关游戏的必要条件等,因此常用元素将直接影响游戏是否可以继续进行;而不常用元素在游戏世界中主要起装饰作用,比如游戏中的天空、云朵、树木和地形等,这些元素不会影响到游戏的主线,但是它们可以提升游戏的整体效果。

1游戏地形

玩过3D游戏的朋友应该对那些高低起伏的地形很有印象吧。无论是秀丽的山川还是辽阔的平原,地形元素都会很生动地出现在游戏世界中,这些高低起伏的地形是2D游戏无法媲美的。Unity中有一套非常好的地形编辑器,它可以让开发者实现游戏中任何复杂的地形,还可以制作地形上的一些元素,比如树木、草坪和石头等。

1.1创建地形

下面开始学习如何创建游戏地形。首先打开Unity,在导航菜单栏中选择“Terrain”→“Create Terrain”菜单项,创建一个游戏地形。

图1 “Terrain”菜单

1.2 地形参数

地形参数包括地形的宽度、高度、长度、分辨率和高度图等。创建完地形后,可任意修改它们的参数。在Unity导航菜单栏中选择“Terrain”→“Set Resolution”菜单项,此时将弹出“Set Heightmap resolution”窗口,在每一个地形参数右侧直接输入数值即可修改它,然后在界面下点击右下角的“Set Resolution”按钮,即可将当前设置的所有地形参数应用到地形当中。

图2 设置地形参数

1.3编辑地形

到目前为止,我们创建爱你的地形还是一个巨大的平面,下面我们将学习如何编辑地形,实现高低起伏的地形效果。首先在Hierarchy视图中选择“Terrain”地形,此时在右侧的Inspector视图中将显示用来编辑游戏地形的菜单。可以看到,地形菜单栏中一共含有7个按钮(第一个方框内),它们的含义难以分别为编辑地形高度、编辑地形特定高度、平滑过渡地形、地形贴图、添加草与网络模型、其他一些设置。

图3 编辑地形

1.4 地形贴图

给地形添加贴图,让地形看起来更为美观。Unity提供了地形标准资源包,其中包含很多现成的地形资源以及贴图,它们都是免费供开发者使用的。

首先需要将地形资源包将成功导入当前工程中。下面我们来学习如何给地形添加新的贴图。在地形菜单栏中点击第四个按钮(地形贴图),可以发现目前在“Textures”列表中没有任何地形贴图。

1.5地形元素

一般情况下,在游戏地形上会放置很多元素,这些元素与地形是分开的,主要包括树木、草地或自定义网格模型。地形元素在游戏世界中起装饰作用,所以不必将它们看做游戏对象,或者为它们添加复杂的游戏脚本。

2 光源

在3D游戏中,光源是一个非常具有特色的游戏组件,为什么这么说呢?因为它可以提升游戏的画面质感。在新创建的场景中,默认是没有光源的,场景非常昏暗,所以游戏开发中必须在场景中添加光源组件。

Unity引擎一共为开发者提供了3种不同的光源类型——点光源、聚光灯和平行光,它们可以模拟自然界中的任何一种光。光源属于游戏对象,可在Scene视图中编辑它的位置以及光照的相关参数。此外,光源还支持移动、旋转和缩放等操作。在实际开发中,大家可根据不同的场景而使用不同的光

源。

2.1 点光源(Point Light)

顾名思义,点光源是在3D世界中从某一个点向周围扩散发出光的光源。点光源好像包围在一个类似球形的物体中,读者可将球形理解为点光源的照射范围,就像家里的灯泡可以照亮整个屋子一样。创建点光源的方式为在Hierarchy视图中点击“Create”→“Point Light”菜单项。

2.2 聚光灯

聚光灯的原理很简单,它在3D世界中以某一个点为起点向以另一个点为圆心的平面发射一组平行光,以射线的形式照射在平面中,与手电筒的原理如出一辙。聚光灯在游戏中的应用非常广泛,比如在第一人称游戏中,可将聚光灯绑定在主角身上,当玩家控制主角移动时,该光源也会跟着移动,始终照亮主角前方的路。创建聚光灯的方法如下:在Hierarchy视图中选择“Create”→“Spot light”菜单项。

2.3 平行光

平行光(Directional Light)的照射范围非常大,它可以照亮整个游戏世界,就好比自然界的太阳一样。在游戏开发中,室外场景必须设置平行光,否则游戏世界整体会非常黑暗。

3天空盒子

在3D世界中,所有游戏元素都置于天空盒子当中。天空没什么神秘的,读者可以将天空想象成一个巨大的盒子,这个盒子将整个游戏视图都包在了其中。在Unity引擎中制作天空盒子非常方便,只需简单几步就可以完成。

制作天空盒子之前,我们首先需要寻找天空的贴图资源。Unity为开发者提供了天空盒子资源包,里面包含很多天空的资源贴图,使用这些贴图可以制作一个美丽的天空。首先在Project视图中点击鼠标右键,从弹出的快捷菜单中选择“Import Package”→“Skyboxes”菜单项,将天空盒子资源包引入工程,如图5-30所示。在资源包中,共含有9款天空贴图资源。因为天空盒子由立方体组成所以我们需要包含6个面的贴图材质。在右侧的Inspector视图中,可看到每一个天空材质共有六个面的贴图,分别是Front (前)、Back(后)、Left(左)、Up(上)和Down(下)。

3.1 Skybox组件

因为摄像金照射的面正是游戏显示的内容,所以可在摄像机上绑定一个Skybox组件,用于在Game视图中直接显示天空盒子贴图。首先在Hierarchy 视图中选择Main Camera游戏对象(当前摄像机),然后在Unity导航菜单栏中选择“Component”→“Rendering”→“Skybox”菜单项,即可将天空盒子组件添加至主摄像机当中。然后在天空盒子组件中设置“Custom Skybox”(自定义天空盒子)贴图资源:点击右侧的按钮,程序将弹出选择天空盒子贴图界面,选择一款天空盒子材质加至其中即可。运行游戏后,美丽的天空就会出现在游戏画面中。

3.2 在场景中添加天空盒子

在游戏场景中直接设置天空盒子,可避免在多个摄像机中设置天空盒子带来的切换视角后贴图显示的问题。在场景中添加天空盒子的方法如下:首先在Unity导航菜单栏中选择“Edit”→“Render Settings”菜单项,打开渲染设置界面,在该界面的“Skybox Material”(天空盒子材质)选项中设置哎天空的材质,然后将其直接应用于游戏场景中。如此添加的天空盒子就不必担心摄像机切换的视角问题,因为它是将真正的盒子放在游戏世界当中了。

4 摄像机

摄像机组件是Unity的核心组件之一,游戏界面中显示的一切内容正是场景中射线机所照射的部分。作为一个游戏对象,摄像机存在Scene视图中,它可以设置自身的位置、照射的方向、照射的面积和照射的图层。下面我们来学习一下摄像机组件的一些常用参数。

□Clear Flags:背景显示内容,默认是Skybox(天空盒子),前提是必须在“Render Settings”中设置过天空盒子材质。

□Background:背景显示颜色。如果没有设置天空盒子,将显示这个颜色。

□Culling Mask:用于选择是否显示某些层,默认为“Everything”(全部显示)。

□Projection:摄像机的类型。

□Field of View:摄像机的视野范围。

□Near:以摄像机为圆心,绘制最近点的距离。

□Far:以摄像机为圆心,绘制最远点的距离。

□Normalized View Port Rect:可理解为设定Game视图的显示区域参数。多台摄像机可以通过设置各自显示区域来分屏同时显示。

□Depth:摄像机的深度。若存在多个摄像机,先渲染该值较小的摄像机。

□Rendering Path:渲染路径。

□Target Texture:目标纹理,设置后会挡住摄像机。

4.1 摄像机的类型

Unity将摄像机分为两种类型,他们观察模型的角度是完全不同的:一种是放射观察角度,另一种是垂直观察角度。摄像机的类型将直接影响Game 视图中的渲染效果,下面我们将学习如何设置摄像机的类型。在Hierarchy 视图中选择摄像机对象,然后在右侧的Inspector视图中单机“Projection”下拉列表,可以看到该列表中有两个选项,分别是Perspective和Orthographic。

三、实验内容及步骤

1. 熟悉及掌握地形元素,练习创建地形,对地形进行编辑,给地形贴图、植草、植树,掌握地形元素的使用方法。

创建地形:

编辑地形:

地形贴图:

植树:

草:

2. 熟悉光源的各项参数,光源的类型,分别在场景中添加平行光,点光源,聚光灯,并进行参数设置,观察其效果。

点光源:

聚光灯:

3. 熟悉及掌握天空盒子的使用方法,练习在场景中添加天空盒子,练习对摄像机添加天空盒子。

对摄像机添加天空盒子:

在场景中添加天空盒子:

4. 熟悉及掌握摄像机的各个参数设置,并联系摄像机的切换。

源代码:

using UnityEngine;

using System.Collections;

public class qiehuan : MonoBehaviour {

private GameObject Camera0;

private GameObject Camera1;

private GameObject Camera2;

// Use this for initialization

void Start () {

Camera0=GameObject.Find("Camera0");

Camera1=GameObject.Find("Camera1");

Camera2=GameObject.Find("Camera2");

}

void OnGUI(){

if(GUILayout.Button("投射侧面",GUILayout.Height(50)))

{

Camera1.active=false;

Camera2.active=false;

Camera0.active=true;

}

if(GUILayout.Button("投射正面",GUILayout.Height(50)))

{

Camera0.active=false;

Camera2.active=false;

Camera1.active=true;

}

if(GUILayout.Button("投射上面",GUILayout.Height(50)))

{

Camera1.active=false;

Camera0.active=false;

Camera2.active=true;

}

}

}

实验四应用物理引擎实现游戏

一、实验目的与要求

1. 熟悉并掌握刚体及使用方法。

2. 熟悉并掌握碰撞器及使用方法。

3. 熟悉并掌握射线及使用方法。

4. 熟悉并掌握关节及使用方法。

5. 熟悉并掌握角色控制器及使用方法

二、实验原理及知识点

物理引擎就是在游戏中模拟真实的物理效果:比如,场景中有两个立方体对象,一个在空中,一个在地面上,在空中的立方体开始自由下落,然后与地面上的立方体对象发生碰撞,而物理引擎就是用来模拟真实碰撞后的效果。

Unity的物理引擎使用的是NVIDIA(英伟达)的PhysX。目前,PC上很多游戏发烧友使用的显卡都是英伟达,该显卡是专门为游戏而设计的,它的物理引擎的效果很好,可以完美地在3D世界中模拟任何物理效果。该引擎完全可适用于次世代游戏开发,它渲染的游戏画面更加逼真,给玩家身临其境的感觉。如需让模型感应物理引擎的效果,需要将刚体组件或者角色控制器组件添加至该对象当中,刚体组件所受的物理效果是完美虚拟现实中的物理效果,而角色控制器需要受一些限制条件来感应物理效果。

1刚体

刚体是一个非常重要的组件。新创建的物体默认情况下是不具备物理效果的,而刚体组件可以给物体添加一些常见的物理属性,比如物体质量、摩

擦力和碰撞参数等,这些属性可用来真实模拟该物体在3D游戏世界中的一切行为。刚体可以以游戏组件的形式绑定在物体当中。如果物体添加了刚体组件,那么它将感应物理引擎中的一切物理效果。

1.1简单使用

要想使用刚体,首先需要将刚体组件添加至游戏对象当中,具体操作方法如下:在Unity中创建一个需要添加刚体组件的游戏对象,比如立方体对象、球体对象、模型对象等含有网格的对象皆可,接着在Hierarcliy视图中选择刚刚创建的游戏对象,然后在Unity导航菜单栏中选择"Component"、"Pliysics”一“Rigidbody”菜单。

在例子中我们创建三个立方体,分别将其凌空放置在地面上,并且只给其中一个立方体添加刚体组件:运行游戏后,发现红色立方体正常感应了物理效果,从空中落了下来(因为只给它添加了刚体组件),而剩下的两个立方体依然停留在空中。

在Hierarcliy视图中选择添加过刚体组件的游戏对象,此时在右侧的Inspector视图中可清晰地看到刚体组件包含的属性,下面简要介绍一下其中各个属性的含义。

Mass:质量,数值越大物体下落得也就越快。尽量不要让数值其超过10,否则物理效果就不会很真实

Drag:阻力,数值越大物体速度减慢得就越快。

Angular Drag:角阻力,数值越大自身旋转的速度减慢得就越快。

Use Gravity:是否使用重力。

Is Kinematic:是否受物理的影响:

Interpolate:设置图像差值。

Collision Detection:碰撞监测。

Constraints:冻结,停止某个轴向感应物理引擎的效果。

Freeze Position:冻结x轴方向、Y轴方向和z轴方向。

Freeze Rotation:冻结x轴旋转、y轴旋转和z轴旋转。

1.2力

力在物理学中是一个非常重要的元素,其种类有很多。刚体组件可以受力的作用,比如给刚体施加一个x轴方向的力,那么该刚体绑定的物体将沿着x轴方向向前移动,这就好比用力将物体扔出去一样,该物体将会以抛物线的形式移动,而不是呆板地做匀速平移。

Unity中力的方式有两种:第一种为普通力,需要设定力的方向与大小;第二种为目标位置力,需要设定目标点的位置,该物体将朝向这个目标位置施加力。在例子中,我们共放置两个球体对象,点击“普通力”按钮后,小球将像一脚被踢开似地向前滚动。点击“位置力”按钮后,小球将被施加一个朝向目标点的力,然后向目标滚动。使用方法rigidbody.AddForce()添加一个普通力,该方法的参数是施加力的方向,单位是Vector3容器。使用方法rigidbody .AddForceAtPosition ( )施加一个目标位置力,该方法的第一个参数为目标点的位置坐标,第二个参数为力的模式。

2碰撞器

游戏对象如果需要感应碰撞,那么必须给其添加碰撞器。默认情况下,创建游戏对象时,会自动将碰撞器组件添加至其中,而碰撞器组件决定了模型碰撞的方式。Unity一共为对象提供了5种碰撞器,分别是Box Collider(盒子碰撞器)、Sphere Collider(球体碰撞器)、Capsule Collider(胶囊碰撞器)、Mesh Collider(网格碰撞器)和Wheel Collider(车轮碰撞器),其中Box Collider适用于立方体对象之间的碰撞,Sphere Collider适用于球体对象之间的碰撞,Capsule Collider适用于胶囊体对象之间的碰撞,Mesh Collider比较特殊,它的碰撞方式由自定义模型的自身网格决定,适用于自定义网格的碰撞,Wheel Colhder适用于车轮与地面

或其他对象之间的碰撞。

在碰撞器之间可以添加物理材质,用于设定物理碰撞后的效果。物理材质与碰撞器之间的关系非常紧密,比如两个立方体相撞后,按照物理引擎的效果,它们将开始相互反弹,那么反弹的力度就是由物理材质决定的。

2.1添加碰撞器

添加碰撞器的方式如下:打开Unity,在Hierarchy视图中选择一个需要添加碰撞器的游戏对象,此时在Unity导航菜单栏中选择“Component" -> "Physics”菜单项,然后从中选择碰撞器的种类。

2.2物理材质

物理材质可设定物体的表面材质,不同的表面材质可影响碰撞后的物理效果。物理材质可以模拟自然界中所有的物理碰撞后的效果,比如木头之间的碰撞或者冰块之间的碰撞。此外,物理材质可添加在任何碰撞器中,下面我们就在“Material”中添加碰撞器的物理材质。

Unity标准资源包提供了一些物理材质的资源,我们可以将它们添加至当前工程中。在Project视图中单击鼠标右键,以弹出的快捷菜单中选择“Import Package" -> "Physic Materials”菜单项,此时即可引人物理材质的标准资源包。

标准资源包中提供了‘种常用的物理材质:弹性材质(Bouncy )、冰材质(Tce、金属材质

(Metal),橡胶材质(Rubber)和木头材质(Wood )。在Scene视图中选择需要添加物理材质的物体,然后在Project视图中通过拖动将Bouncy赋值给Inspector视图中的”SpliereCollider”即可。

因为Game视图中的小球对象添加了弹性材质,运行游戏后,小球将从空中自然下落,落地后感应弹性材质,然后再次弹回至空中,如此循环下去。

除了可以使用Unity标准资源包中的5款物理材质,也可以自行创建物理材质。创建新物理材质的方法如下,在Project视图中点击“Create" -> "Pliysic Material”菜单项即可,在右侧的Inspector视图中,我们将看到新创建的物理材质的所有属性,下面简要介绍一下这些属性的含义。

Dynamic Friction:动态摩擦,取值在0到1之间。0表示最小动态摩

。

猜你喜欢

最安全有效的减肥药

最安全有效的减肥药

编辑:小徐

现在的减肥药真的是真假难分,在选择减肥药的同时也应该更加小心,减肥药多种多样,那么如何才能选择最安全有效的减肥药,也成了很多小仙女的内心疑问,下面就跟着正在播放强奷女交警电影小编一起看一下,如何选择最安全有效的减肥药。 最安全有效的减肥药选购方法 1、首先需要观察产品的外包装,在包装中可以看到其配方是不是含有激素,含有激素的减肥药对身体的内..

吃减肥药失眠

吃减肥药失眠

编辑:小徐

随着现在流行以瘦为美,很多人会不顾身体的健康选择减肥药,达到快速减肥瘦身的效果,但是很多减肥药都是有副作用的,副作用比较轻的就是失眠现象,那么吃减肥药出现失眠是怎么回事儿?如果出现失眠后,我们应该怎样缓解? 吃减肥药失眠是怎么回事 减肥药中富含安非他命,所以减肥药服用了太多会有失眠现象,服用减肥药期间,身体会逐渐出现抗药性,身..

最新文章