Unity3D是由
Unity Technologies开发的一个专业游戏引擎,虽然说不及UDK所创造的效果,但它高效率的开发、对多个平台的支持使在国内外具有很高的人气(七月中旬测试的新仙剑奇侠传online便是使用U3D)

【PrefabAsset】
预制属于unity的一种资源,通过使用预制,只需调用实例化函数Instantiate就可以创建实例物体,极为方便;当你想要创建一大群类型相似(勉强描述,比如敌人)的物体,使用预制可以方便的管理,比如你想添加一个组件,只需在预制源添加即可,这样每个实例都会自动添加这个组件,而无需一个个添加。
预制属于unity的一种资源,通过使用预制,只需调用实例化函数Instantiate就可以创建实例物体,极为方便;当你想要创建一大群类型相似(勉强描述,比如敌人)的物体,使用预制可以方便的管理,比如你想添加一个组件,只需在预制源添加即可,这样每个实例都会自动添加这个组件,而无需一个个添加。
你可以在Project中右键创建它(或是
Asset->Create->Prefab
),此时它是一个空的预制,你需要将Hierarchy视图中的一个物体拖拽到新预制中,可以看到该物体变成了蓝色。现在,该物体及其子对象就已经复制到了预制数据中,该物体称作该预制的一个实例(instance)。
你可以在运行时通过脚本调用Instantiate();函数实例化预制

【继承】
当物体被实例化后,他可以拥有与其他实例不同的数据,使你的实例变得独一无二。当你改变实例的数据(如变量)时,它将以粗体显示,表示这是可重写的变量,但只影响该物体,其他的物体不会受到影响。
如果你希望应用到所有实例,点击Apply;在没有应用之前使用Revert可以恢复被改变的值

【恢复链接】
当你添加或删除一个组件或者子对象时,可能会破坏单个实例与预制源之间的链接,要恢复链接:
Reconnect——丢弃该实例与预制源的差别,恢复原样
Apply——将复制这些差别到所有其他的实例
【实例化函数】
(//注:此处用的是js函数原型)
static function Instantiate (original : Object, position : Vector3, rotation : Quaternion) : Object
这个函数实例化一个物体并返回,
static function Instantiate (original : Object) : Object
这个函数将克隆一个物体并返回,与Duplicate命令是相同的
上述两个函数实质上是克隆物体或者使一个预制产生实例,一般是事先定义一个GameObject(public)或者是Transform(或者其它组件),然后original则是这个定义的变量。
*注意,如果你定义了GameObject,你既可以从Project或Hierarchy视图拖拽到变量上为其赋值(要锁定Inspector),也可以从变量右边的圆圈打开选择,但是如果你定义的是组件类型的变量,那么如果你用第二种办法会发现Asset选栏中是空的,你只能使用拖拽的办法。
【RandomClass】
Random类用于产生随机数据,具体的类变量和函数这里不一一列举,不过需要注意的一点是,Range类函数经常会用到,如果你用的是
static function Range (min : int, max : int) : int那么它返回的数可能会返回min,但是永远不会反回max,也就是说,如果你需要从1-10返回任意一个数,你想他有一定概率返回10,那么max就要写11,而不是10。
如果你用的是static function Range (min : float, max : float) : float,那么返回的范围将包含两个极端值。
游戏中常常需要用到随机的策略,比如说你希望玩家在战斗结束后抽选胜利品,那么你可以这么做:摆出9张牌,让玩家自由选择一张,然后随机得到一个奖励,这里所谓的“随机”就是说不是你一开始就设计好了,而是当他选择时让程序自己抽取计算,从奖励库中随即取出一个奖励,那么这里就需要用到Random类,Random类的功能:
*从数组内抽取一个随机元素
*用不同概率选中数据
*随机排序
*随机放置物体,并排除重复
*...............等等,它还可以结合Instantiate函数,实例化物体,并放置在随机的位置,或是赋予其随机的数据。
*

【简单例子】
【实现效果】:
刚才随机中讨论到一个有趣的例子,在屏幕上放置9个框子,让玩家自由选择一个,然后输出奖励信息
p.s.:关于这一类文章如果举例子,例子内容尽可能简单或者说是简陋,不在资源素材上下过多功夫
【资源】:
一、正常情况的框子 二、鼠标点下时的框子
p.s.:导入时选择Texture Type选择GUI,你无须选择Advanced一个个参数调整。
【流程】:
1.
GameObject->Create Other->GUI Texture创建一个GUI纹理,放置纹理。
2.
GameObject->Create Other->GUI Text创建一个GUIText,用于输出奖励信息。

2.Project视图下,右键创建一个Prefab,将刚创建的物体拖到Prefab中,更改其Texture属性,Pixel Inset下的Height和Width属性。

p.s.:这里用不用Prefab无所谓,你也可以直接复制9个GUITexture物体。
5
.选择Main Camera,Background下改成白色(框子我没有做alpha通道)。

7.创建一个C#脚本,要改颜色,你可以创建一个材质,并且指定颜色,然后赋予到Material属性栏,或者在Awake函数下调用:guiText.material.color = Color.red;
8.现在,要判断鼠标是否放在框子上面,如果放在框子上,更换一个纹理,当鼠标按下时,输出奖励信息
我的思路是创建一个脚本,赋予到Prefab上,使用OnMouse系列函数响应
输出信息使用随机判断,使用Random类Range函数,从1-9返回一个int值,然后判断这个值是多少,输出信息,也就是说获得每种奖励的概率是九分之一,当然你可能希望获得低奖励几率更高些。
代码如下;
using UnityEngine;
using System.Collections;
public class Random_demo : MonoBehaviour {
public GameObject guiText_pt;
public Texture2D normal_tex;
public Texture2D down_tex;
string print_str;
void OnMouseEnter () {
guiTexture.texture = down_tex;
}
void OnMouseUp(){
int rnd = Random.Range(1,10);
switch(rnd)
{
case 1:
print_str = "EXP+100";
break;
case 2:
print_str = "EXP+200";
break;
case 3:
print_str = "EXP+400";
break;
case 4:
print_str = "EXP+800";
break;
case 5:
print_str = "EXP+1600";
break;
case 6:
print_str = "EXP+3200";
break;
case 7:
print_str = "EXP+6400";
break;
case 8:
print_str = "EXP+12800";
break;
case 9:
print_str = "EXP+25600";
break;
}
guiText_pt.guiText.text = print_str;
}
void OnMouseExit(){
guiTexture.texture = normal_tex;
}
}
*或许你可以用一个数组,抽取数组中的元素更好,这里就非常笼统的这么写了。


*这是我发布后的效果,关于发布这方面以后会谈到,你只需简单地选择发布选项,加入你所需要的场景即可。