Unity Manual用户手册-创建游戏

来源:互联网 发布:定制家具效果图软件 编辑:程序博客网 时间:2024/04/30 03:40

Unity Manual用户手册-创建游戏

Unity允许游戏设计师制作游戏。很特别的是Unity不需要有数年的编程经验或一定程度的美术就能制作有趣的游戏。只需要学习少数基本的Unity流程。一旦懂得,你就可以马上自己制作游戏。很快你就能使你的游戏运行起来,你将有更多的时间去优化和演算,使你的游戏完美。

这个章节描述你需要知道的核心观念,独特的,令人惊讶的,和有趣的游戏。大多数的过程需要你编写脚本(Scripts)。创建和书写脚本的概述,请阅读Scripting页。

---------------------------------------------------------------------------------------------------

运行时使用例示(Instantiating)预制物

这个要点你将懂得在基本关卡的预制(Prefabs)概念。他们收集预设的游戏物体和组件(GameObjects & Components)重利用在你的游戏。如果你不知道什么是预制物,我们建议你选阅读Prefabs页。

预制物迟早有用的,当你要在运行时游戏例示结构复杂的游戏物体。可选择的例示预制物是全部使用代码创建游戏物体。例示预制物有很多益处在替代的方法上:

l 你能使用一行代码例示预制物,有完整的功能。创建相等的游戏物体用代码平均要五行代码,可能更多。

l 你能建立,测试,和修改预制物快而简单的在场景和检视面板。

l 你能改变预制物和实例无需改变例示她的代码。一个简单的火箭可能改变成一个超动力火箭,并不是必须改变代码。

常见方案

为了说明预制物的优点,我们来考虑你迟早会遇到的基本情况:

1.   使用单个预制的砖块多次创建在不同的位置来建造一堵墙。

2.   火箭筒例示燃着的飞行的火箭预制物。这个预制物包含一个模型网格(Mesh),刚性主体(Rigidbody),碰撞点,和一个子游戏物体跟踪他的粒子系统。

3.   一个机器人爆炸成很多块。一个完整的可用的机器人被毁坏和替代为一个毁坏的机器人预制物。这个预制物由好多部分组成机器人,所有准备好的她自己的刚性主体和粒子系统。这个技术允许你报一个机器人爆炸成很多块,只需一行代码,使用一个预制物替代一个物体。

建造一堵墙

这个例子说明使用预制物比使用代码创建物体的优点。

首先,我们使用代码建造一块砖:

function Start () {
    for (var y = 0; y < 5; y++) {
        for (var x = 0; x < 5; x++) {
            var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
            cube.AddComponent(Rigidbody);
            cube.transform.position = Vector3 (x, y, 0);
        }
    }
} 

l 使用上面的脚本我们简单的保存脚本并放置她到一个空的游戏物体。

l 创建一个空的游戏物体使用GameObject->Create Empty

如果你运行代码,进入游戏模式,你将看到整个砖墙被创建。这里有2个关系到每个砖块的功能的代码:CreatePrimitive()AddComponent()。此时还不错,但是每个我们的砖块是无结构的。每个添加到砖块的行为,像改变材质,摩擦力,或刚性质量,都需要额外的代码。

如果你创建一个预制物并预先执行好所有的设置,你使用一行代码执行创建和设置每个砖块。这使你想要改变时无需保持呵呵改变很多代码。使用预制物,你要改变和运行,不是必须改变代码。

var cube : Transform;

function Start () {

    for (var y = 0; y < 5; y++) {

        for (var x = 0; x < 5; x++) {

            var cube = Instantiate(cube, Vector3 (x, y, 0), Quaternion.identity);

        }

}

}

这不是很规则但是可以重用的。这可以例示到一个包含刚性主体的正方体。所有在预制物里的定义能很快的在编辑器里创建。

现在我们只需要在编辑器里创建预制物,这样创建:

1.   选择GameObject->Create Other->Cube

2.   选择Component->Physics->Rigidbody

3.   选择Assets->Create Prefab

4.   在工程视图,改变你的新预制物的名字为砖块

5.   拖拽你创建的层次视图中的正方体到工程视图中的砖块预制物

6.   创建完预制物,你能安全的删除层次视图中的正方体

我们创建了砖块预制物,所以现在我们添加cube变量到脚本。选择包含脚本的空游戏物体,看到检视视图中出现新的变量,名为”cube”

这个变量能接受一些游戏物体或预制物

现在拖拽工程视图中的“Brick”预制物到监视视图中cube变量。按下Play你将看到墙使用预制物建造。

这是能在Unity中不断重复使用的流模式。开始时你可能怀疑这样为什么更好,因为脚本使用代码创建正方体只需要2行。

但是因为你现在使用预制物,你可以随时调整它。想要调整所有这些实例的质量?只需调整预制物里的刚性主体。想要在所有实例使用另一个材质(Material)?只需拖拽材质到预制物。想要改变摩擦力?使用另一个物理材料(Physic Material)到预制物的碰撞点。想要添加一个粒子系统到所有的盒子?添加一个子物体到预制物。

例示火箭&爆炸

这是预制物融合的方案:

1.    一个火箭筒例示火箭预制物当使用者按下fire这个预制物包含一个模型网格,刚性主体,碰撞点,和一个子游戏物体跟踪他的粒子系统。

2.    火箭碰撞到且例示爆炸预制物。爆炸预制物包含一个粒子系统,一个渐暗的灯光,和一个毁坏周围游戏物体的脚本。

也可以完全使用脚本建造火箭游戏物体,添加组件和调整属性,比例示一个预制物更简单。你能使用一行代码例示火箭,不管怎样组成火箭预制物的。例示预制物之后你也能修改他的属性(你能设置火箭的速度)。

更简单的,你可以以后再更新火箭。所有你建造一个火箭,不必马上添加一个跟踪粒子给他,你可以以后再做。一旦你添加一个子游戏物体给预制物,所有你例示的火箭都会有跟踪粒子。最后,你能很快的在检视视图中调整火箭预制物的属性,更容易展示你的游戏。

这个脚本演示火箭如何使用Instantiate()函数。

// Require the rocket to be a rigidbody.
// This way we the user can not assign a prefab without rigidbody
var rocket : Rigidbody;
var speed = 10.0;
 
function FireRocket () {
    var rocketClone : Rigidbody = Instantiate(rocket, transform.position, transform.rotation);
    rocketClone.velocity = transform.forward * speed;
    // You can also acccess other components / scripts of the clone
    rocketClone.GetComponent(MyRocketScript).DoSomething();
}
 
// Calls the fire method when holding down ctrl or mouse
function Update () {
    if (Input.GetButtonDown("Fire1")) {
        FireRocket();
    }
} 

替代一个角色使用玩偶或毁坏物

我们假设你有一个完全作弊的敌人角色且他死亡了。你能简单的播放角色的死亡动画和使所有敌人逻辑句柄脚本无效。你可能要移走好多脚本,添加一些基本的逻辑使别人不再工具死去的敌人,以及其他的清理工作。

更好的方法是马上删除全部角色且使用一个例示毁坏预制物替代他。这给他更多机动性。你可以使用一个不同的材质给死亡角色,附加完全不同的脚本,产生包含毁坏为很多块模仿毁坏的敌人的预制物,或简单的例示一个预制物包含角色形式。

所有的设置能使用单一的Instantiate()完美实现,你只要离开为正确的你设置的预制物!

重点记住的是你使用的Instantiate()可以是和原始时完全不同的物体。例如,如果你有一个飞机,你有2中模型形式。一个是飞机使用单一的游戏物体模型演示(Mesh Renderer)和使用脚本控制物理。保持模型为单个游戏物体,你的游戏能通过减少三角形变的更快,和由一些物体组成比使用小的部分快。同样你的飞机飞行的很好也没哟什么需要分成很多块的原因。

建造一个毁坏的飞机预制物,使用下面的步骤:

1.    使用很多不同的你喜欢的模型块组合你的飞机

2.    创建一个空的场景

3.    拖拽模型到空的场景

4.    添加刚性主体到所有部分,选取所有部分和选择Component->Physics->Rigidbody

5.    添加碰撞盒到所有部分,选取所有部分和选择Component->Physics->Box Collider

6.    为一个额外的特殊效果,添加一个烟一样的粒子系统作为子游戏物体到每个部分

7.    现在你有一个有多个分开部分的飞机,他们有物理而落地和将创建一个粒子跟踪到现在的粒子系统。运行并观察你的模型怎样反应,做必要的修改。

8.    选择Assets->Create Prefab

9.    拖拽包含所有飞机部分的根游戏物体到预制物

var wreck : GameObject;
 
// As an example, we turn the game object into a wreck after 3 seconds automatically
function Start () {
    yield WaitForSeconds(3);
    KillSelf();
}
 
// Calls the fire method when holding down ctrl or mouse
function KillSelf () {
    // Instantiate the wreck game object at the same position we are at
    var wreckClone = Instantiate(wreck, transform.position, transform.rotation);
 
    // Sometimes we need to carry over some variables from this object
    // to the wreck
    wreckClone.GetComponent(MyScript).someVariable = GetComponent(MyScript).someVariable;
 
    // Kill ourselves
    Destroy(gameObject);
} 

第一人称设计教程介绍了如何用玩偶替代一个角色和同步最后的动作状态。你能在Tutorials页找到教程。

配置一捆物体为确切的样式

假设你想要捆绑一些物体为一个方形或圆形样式。一般是这2个之一。

1.    完全使用代码建造物体。很单调的!放入一个值到脚本也很慢,直接而没有困难。

2.    使用完整的物体作弊,复制并摆放他很多次到场景。这是单调的,且配置物体到精确的格很难。

所以使用预制物的Instantiate()代替!我想你已经清楚为什么预制物在这些方案中比较简单。这是方案必须的代码:

// Instantiates a prefab in a circle
 
var prefab : GameObject;
var numberOfObjects = 20;
var radius = 5;
 
function Start () {
    for (var i = 0; i < numberOfObjects; i++) {
        var angle = i * Mathf.PI * 2 / numberOfObjects;
        var pos = Vector3 (Mathf.Cos(angle), 0, Mathf.Sin(angle)) * radius;
        Instantiate(prefab, pos, Quaternion.identity);
    }
} 
// Instantiates a prefab in a grid
 
var prefab : GameObject;
var gridX = 5;
var gridY = 5;
var spacing = 2.0;
 
function Start () {
    for (var y = 0; y < gridY; y++) {
        for (var x=0;x<gridX;x++) {
            var pos = Vector3 (x, 0, y) * spacing;
            Instantiate(prefab, pos, Quaternion.identity);
        }
    }
} 

--------------------------------------------------------------------------------------------------------

输入

Unity支持键盘(Keyboard),游戏杆(Joystick)和游戏垫(Gamepad)输入。

实际轴(virtual axes)和按钮可以使用输入管理器(Input Manager)创建和最终用户能设置键盘输入在一个漂亮的设置框。

你能设置游戏杆,游戏垫,键盘和鼠标,接入他们在一个简单的脚本界面。

在脚本,所有实际轴使用他们的名字存储。

每个工程在创建时有下面的缺省输入:

l  水平(Horizontal)和竖直(Vertical)映射为w,a,s,d和方向键。

l  开火1Fire1,开火2,开火3为控制,附件(Alt)和命令,各自。

l  鼠标X(Mouse X)和鼠标Y映射鼠标的三角移动。

l  窗口震动XWindow Shake X)和窗口震动Y映射窗口移动。

添加新的输入轴

如果你想添加新的实际轴到Edit->Project Setting->Input菜单。这里你能改变每个轴的设置。

你设置每个轴用2个按钮,其之一为游戏杆,鼠标或键盘按键。

名字(Name:核对的这个轴在脚本的名字

说明的名字(Descriptive Name:正向价值名字显示在构架对话框的输入清单用于建造

说明的消极名字(Descriptive Negative Name:反向价值名字显示在构架对话框的输入清单用于建造

反向按钮(Negative Buttun):按钮用来按下反向轴

正向按钮(Positive Buttun):按钮用来按下正向轴

Alt反向按钮(Alt Negative Buttun)Alt按钮用来按下反向轴

Alt正向按钮(Alt Positive Buttun)Alt按钮用来按下正向轴

重力(Gravity):轴向滑落的以秒为单位的速度,当没有按钮按下时

死亡(Dead):类似死亡范围的尺寸

敏感度(Sensitivity):轴移动的以秒为单位的目标值,只适用与数字设备

快照(Snap:如果激活,轴的值将设置为0,当按下反向按钮时

倒置(Invert):如果激活,正向按钮变为反向,反正截然

类型(Type):控制这个轴的输入类型

(Axis):控制这个轴的连接设备的轴

键名字(Joy Num):将控制这个轴的连接的游戏杆

使用这些设置细致调整查看和感觉输入。他们在编辑器里也有标签说明。

从脚本使用输入轴

你可能质疑脚本的初始状态是这样的:

Value = Input.GetAxis(“Horizontal”);

一个轴的取值范围是-11.中间为0.这个情况适用游戏杆输入和键盘输入。

当然,鼠标三角和窗口三角是最后帧鼠标或窗口移动的距离。意思是他能大于1和小于-1当用户移动鼠标太快。

这可能创建多个相同名字的值。当调用输入轴,其返回最大平均值。这可能分配多个输入设备到一个轴名字。例如,创建一个键盘轴和一个游戏杆轴有相同的名字。

按钮名字

设置键到一个轴,你要输入键名字到正按钮或反按钮属性在检视视图。

键名字有下面的协议:

l  字母键:“a, b, c

l  数字键:“1, 2, 3

l  方向键:“up, down, left,”right”…

l  小键盘键:“[1], [2], [3],”[+]”,”[equals]”…

l  修饰键:

l  鼠标按钮(一些游戏杆):

l  游戏杆按钮(特殊游戏杆):

l  特殊键:

l  功能键:

识别键的名字和脚本界面,检视视图中的一样。

value = Input.GetKey(“a”)

--------------------------------------------------------------------------------------------------------