您的位置:首页 > 移动开发 > Unity3D

unity 5.x游戏开发指南——第一二三章

2017-07-30 22:15 253 查看

第一章 基础知识

1.1unity简介

1.2unity的历史

1.3下载与安装

1.4打包与发布

设置sdk、jdk的路径

player 设置界面:公司名、产品名、图标

Resolution and presentation:游戏屏幕的朝向

Splash Image:设置应用启动画面

Other Setting:PlayerSettings.bundleIdentifier,应用程序的bundle id,是设备识别应用的id。

第二章 unity编辑器

2.1游戏工程

unity工程由若干个场景组成。例如过关游戏,每一关是一个场景。

2.1.1创建工程

输入工程名,路径,项目是2d还是3d

2.2主界面

主菜单:

File 创建、打开、保存场景,创建、打开、保存工程、发布游戏

Edit 撤销 重做 剪切 粘贴 运行 暂停 工程设置

Asset 创建导入资源

2.3project视图

罗列了工程的所有资源:脚本 预制体 材质 动画 纹理贴图等。右键菜单 创建 在文件夹显示 打开文件 删除文件 导入新资源 导入包 导出包 在Scene和hierarchy视图显示使用了选中资源的游戏对象 选择依赖的所有资源 刷新 重新导入选中资源

2.4hierarchy视图

显示了场景中所有的游戏对象

create

2.5inspector视图

显示当前选中游戏对象的所有组件及组件属性。组件中脚本的public变量在此视图中会以属性的方式呈现,在视图属性可以直接修改属性的值。如果属性是gameobject或者Transform类型,可以直接将游戏对象拖拽过来完成指定。

2.6Scene视图

对场景中游戏对象进行可视化操作的界面,在此视图中我们可以通过工具或快捷键对游戏对象进行操作

工具栏

手工具:点击手工具图标或按快捷键Q使用该工具,用于控制观察摄像机;Alt再按鼠标左键,改变摄像机观察方向;Alt,再按鼠标右键,改变摄像机的观察距离;control再拖拽,改变摄像机的观察方向。

移动工具:点击图标或按快捷键w,移动选中的游戏对象,红绿蓝对应xyz轴,有3个小正方形,点击拖动会沿着某个平面移动;

旋转工具:图标或e,红绿蓝分别表示沿着xyz轴旋转;

缩放工具:红绿蓝,3个方向缩放;灰色立方体:3个方向同时缩放

Scene Gizmo:点击红色圆锥体:将摄像机角度设置为由x轴正方向朝着x轴负方向看,点击相对的灰色按钮,则是将摄像机设置为由x轴负方向朝着x轴正方向看;

同样,绿色是y轴,蓝色是z轴。

点击主体下面的图像加文字,切换摄像机模式,透视观察摄像机、正交观察摄像机。

点击scene视图左上角的shaded按钮,进入Scene视图的渲染模式菜单,shaded为默认模式,所有游戏对象的贴图都正常显示,wireframe所有游戏对象的贴图不显示,仅仅将游戏对象的网格模型以线框形式显示。

2.7Game视图

显示游戏运行时的图像。运行游戏后,即可在game视图中看到游戏效果。game视图显示的内容一般取决于摄像机看到的内容,通常游戏中会有多个摄像机协同工作,此时显示的内容是多个摄像机画面的叠加。

play菜单

第一个运行按钮,所有在运行时对场景的游戏对象的操作都是临时的;第二个是暂停按钮,点击暂停,再点击就继续;第三个是逐帧播放按钮,点击暂停游戏,再次点击播放下一帧。

分辨率菜单

可以选择其中一项指定Game视图下的游戏画面的分辨率。例如3:2landscape表示宽和高的比例为3:2;wxga LandScape(1280*800)表示指定分辨率为1280*800.

Game视图右侧菜单

maximize on play:是否在运行时最大化显示

mute audio:是否静音

stats:查看当前画面对应的数据

gizmos:是否显示gizmos

预制体

如果场景中需要复制大量相同的游戏对象,就需要将游戏对象保存在工程中,在需要的时候创建出来,这就是预制体。预制体存储着一个游戏对象,包括游戏对象的所有组件及其下的所有子游戏对象。

创建预制体

create prefab,然后将hierarchy视图中的立方体拖拽到project视图下新建的prefab上,即完成。在hierarchy视图中与预制体关联的游戏对象为蓝色。点击对象inspector窗口的select按钮,会高亮显示对应的预制体。

预制体实例化:拖拽

第三章 unity脚本

unity的编程工作都是在脚本里编写的,脚本通过添加到游戏对象的方式运行。如果说模型美术资源是游戏的皮肤,那么脚本系统是它的心脏,决定着一款游戏能否健康稳定的运行。

monoDevelop脚本编辑器

是unity采用的跨平台的脚本编辑器。就在unity安装路径的根目录下。

为游戏对象添加脚本十分简单,右键create选择即可

默认创建的代码会引用UnityEngine命名空间和system.collections。会继承monoBehaviour类,所有创建的用于添加到游戏对象上的脚本都必须继承自MonoBehavior,所以MonoBehavior是我们首先要学习的类。

MonoBehavior

Awake 脚本唤醒函数,当游戏对象被创建的时候,游戏对象绑定的脚本会在该帧内执行awake函数,无论脚本是否处于激活状态;

Start 该函数在脚本被激活的时候执行,位于Awake函数之后。该函数同样在游戏对象被创建的帧里,不同的是,如果脚本处于不激活状态,start函数是不会被执行的。

update 只要处于激活状态下的脚本,都会在每一帧里调用update函数。

lateUpdate 该函数是延迟更新函数,处于激活状态下的脚本在每一帧里都会在update函数执行后执行该函数,通常用来调整代码执行的顺序。

FixedUpdate 该函数用于固定更新,每隔固定时间调用一次。在Edit Project Settings Time里Fixed Timestep选项用于设置fixedupdate的更新频率,默认为0.02s。

OnGUI 绘制界面函数,一般作为测试功能使用

OnDestroy 在当前脚本销毁时调用该函数

OnEnable 激活函数,当脚本被激活时调用

OnDisable 脚本被禁用时调用。OnDestroy会调用OnDisable。

unityGUI

string text = “”;

string myName = “”;

GUILayout.TextField(text);

if(GUILayout.Button(“提交”))

myName = text;

if(!string.IsNullOrEmpty(myName))

{

GUILayout.Label(“提交成功,名字:” + myName);

}

调试

Debug.Log(string str)

Debug.LogWarning(string str)

Debug.LogError(string str)

游戏对象操作

创建游戏对象

GameObject obj = GameObject.createPrimitive(Primitive.Cube);

obj.AddComponent();

obj.GetComponent().material.color = Color.red;

obj.name = “Cube”;

obj.transform.position = new vector(0, 5, 0);

获取游戏对象

一种是在代码里声明对象,在inspector属性栏里指定游戏对象;

通过对象名称获取对象

GameObject.Find(“Cube”);

寻找整个场景中名为cube的游戏对象并赋予obj变量。

添加组件、修改组件

obj = GameObject.Find(“Cube”);

render = obj.GetComponent();

render.material.color = Color.red;

render.material.mainTexture = texture;

发送广播与消息

在游戏对象之间使用广播传递消息是游戏对象之间互动的一种快捷的方式。主要是通过GameObject.SendMessage(string methodName, object value = null, SendMessageOptions options = SendMessageOptions.RequireReceiver)函数发送的。methodName:消息名,所有MonoBehavior脚本里与该名称同名的方法将被调用;value是向该方法传递的参数;第三个参数是是否必须有接收方法的选项,一般不要求接收方法即可。

新建一个GameObject名为sender,添加脚本

在start函数里:

receiver.SendMessage(“ShowNumber”, 100, SendMessageOptions.DontRequireReceiver);

建另一个游戏对象Receiver并添加脚本,添加ShowNumber方法

void ShowNumber(int number)

{

Debug.Log(“收到的数字为:” + number);

}

允许场景,sender成功向receiver发送消息并输出到控制台。

克隆游戏对象

预制体,instance

Object[] gos = Resources.LoadAll(“superPrefab”);

foreach(Object o in gos)

{

GameObject obj = Instantiate(prefab) as GameObject;

obj.transform.position = new Vector3(0, 3, 0);

}

移动、旋转和缩放游戏对象

transform.Translate(vector3 offset); //物体本身的轴转动

cube.transform.position += new Vector3(-0.5f, 0f, 0f); //沿着世界坐标的方向移动

transform.localScale = new vector3(x, y, z);

x为x轴向的缩放,y为y轴向的缩放,z为z轴向的缩放

整体放大:

transform.localScale *= 1.2;

游戏对象自转

transform.Rotate(new vector3(0, 10, 0));

transform.RotateAround(position, vector3.up, 10); 围绕某一个点旋转

vector3.right x轴正向

vector3.up y轴正向

vector3.forward z轴正向

工具类

时间类

Time.time 从游戏开始时计时,截止到目前共运行的游戏时间;

Time.timeScale 时间流逝的速度

Time.deltaTime 上一帧所消耗的时间

Time.fixedTime 每一次执行FixedUpdate()函数的时间间隔

Time.realTimeSinceStartUp 截止到目前共运行的真实时间

随机数

int i = Random.Range(0, 10);

float f = Random.Range(0, 10);

数学类

Mathf.abs(a) 绝对值

Mathf.Clamp(a, min, max) 将a限制在min和max之间

Mathf.Lerp(from, to, a)插入值,返回值=from+to(1 - a)

Mathf.min(a, b, c, ……)

mathf.max(a, b, c, ……)

mathf.Pow(a, b) a的b次方

Mathf.Deg2Rad:把角度转换成弧度

Mathf.Rad2Deg:弧度转成角度

Mathf.Pi

Mathf.Sin(a)

Mathf.Cos(a) 弧度a的余弦值

Mathf.Tan(a) 弧度a的正切值

四元数

transform.rotation = Quaternion.Euler(0f, rotateSpeed * Time.time, 0);

Euler函数,输入vector3表示围绕x y z轴旋转的角度,该函数返回该角度对应的四元数,然后将四元数赋给立方体的rotation完成旋转

输入控制

玩家点击鼠标左键开火、按住shift键、按住键盘w键前进等都属于输入控制。

Input.GetKeyDown(KeyCode.A)

Input.GetKey(KeyCode.LeftShift)

Input.GetKeyUp(KeyCode.A)

Input.GetMouseButtonUp(0)

Input.GetMouseButtonDown(0)

Input.GetMouseButton(0)

自定义输入

在菜单->Edit->Project Settings->Input,打开设置界面,

按钮类:在里面设置Fire1,Positive Button是Left ctrl,即该按钮用于正向移动轴。Alt Positive Button表示备用按钮用于正向移动轴。因为是单一按钮,只需要填写正向部分

void update()
{
if(Input.GetButtonDown("Fire1"))
{
Debug.Log...
}
}


方向轴:用于控制玩家角色的左右移动、上下移动,它的设置和按钮完全一样,但是方向轴有两个按钮分别对应正负两个方向,按住Positive Button是正值,negative是负值,输出范围是[-1, 1]的浮点数,可以利用它控制角色的左右移动

void Update () {
//得到Horizontal轴的值
float axisH = Input.GetAxis("Horizontal");
Debug.Log("---------" + axisH);
}


移动设置输入

Touch类,FingerId手指的编号,整型,Phase,手指的阶段,Began开始接触屏幕,Moved移动,Stationary静止,Ended手指离开屏幕,Canceled系统关闭触屏

Position:手指触碰屏幕的位置,Vector2类型,坐标以屏幕左下角为原点1像素对应单位,例如iPhone的分辨率为960*640.

void OnGUI()
{
//遍历所有Touch
foreach(Touch touch in Input.touches)
{
//输出Touch信息
GUILayout.Label(string.Format("手指:{0} 状态:{1} 位置:{2}",touch.fingerId,touch.phase.ToString(),touch.position));
}
}


重力感应,很多著名的手机游戏的主要操作是基于重力感应的,原理是当手握移动设备晃动时,移动设备内的加速度计会计算设备在x、y、z3个方向上的线性加速度变化。

void OnGUI()
{
GUILayout.Label("X:"+ Input.acceleration.x);
GUILayout.Label("Y:"+ Input.acceleration.y);
GUILayout.Label("Z:"+ Input.acceleration.z);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: