Unity3D 脚本中文参考 (1)
这是一个关于Unity内部脚本如何工作的简单概览。
Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成。在脚本对象内部不同的函数被特定的事件调用。最常用的列在下面:
Update:这个函数在渲染一帧之前被调用。这里是大部分游戏行为代码被执行的地方,除了物理代码。
FixedUpdate
这个函数在每个物理时间同步被调用一次。这是处理基于物理游戏行为的地方。
在任何函数之外的代码:
在任何函数之外的代码在物体被加载的时候运行。这个可以用来初始化脚本状态。
注意:文档的这个部分假设你是用JS,参考用C#编写脚本获取如何使用C#和Boo编写脚本的信息。
你也能定义事件句柄。它们的名称都以On开始,(例如 OnCollisionEnter)。为了查看完整的预定义事件的列表,参考MonoBehaviour文档。
大多数游戏物体的操作是通过游戏物体的Transform和/或Rigidbody来做的。在行为脚本内部它们可以分别通过transform和rigidbody访问。因此如果你想绕着Y轴每帧旋转5度,你可以如下写:
functionUpdate(){
transform.Rotate(0,5,0);
}
如果你想向前移动一个物体,你应该如下写:
functionUpdate(){
transform.Transtate(0,0,2);
}
Time类包含一个非常重要的类变量,称为deltaTime。这个变量包含从上一次调用Update或FixedUpdate(根据你是在Update函数还是在FixedUpdate函数中)到现在的时间量。
所以对于上面的例子,修改它使这个物体以一个恒定的速度旋转而不依赖于帧率:
function Update(){
transform.Rotate(0,5*Time.deltaTime,0)
}
移动物体:
functionUpdate(){
transform.Translate(0,0,2*Time.deltaTime);
}
如果你加或减一个每帧改变的值,你应该将它与Time.deltaTime相乘。当你乘以Time.deltaTime时,你实际表达:我想以10米/秒移动这个物体而不是10米/帧。这不仅仅是因为你的游戏将独立于帧率运行,同时也是因为运动的单位容易理解。(10米/秒)
另一个例子,如果你想随着时间增加光照的范围。下面的表达式,以2单位/秒改变半径。
functionUpdate(){
light.range*=2.0*Time.delta.Time;
}
当通过力处理刚体的时候,你通常下不必用Time.deltaTime乘,因为引擎已经为你考虑到了这点。
组件被附加到游戏物体。附加Renderer到游戏物体使它在场景中渲染,附加一个Camera使它变为相机物体。所有的脚本都是组件,因为它们能被附加到游戏物体。
最常用的组件可以作为简单成员变量访问:
Component 可如下访问
Transform transform
Rigidbody rigidbody
Renderer renderer
Camera camera(only on camera objects)
Animation animation
Collider collider
……等等。
对于完整的预定义成员变量的列表,查看Component,Behaviour和MonoBehaviour类文档。如果游戏物体没有你想去同类型的组件,上面的变量将被设置为null。
任何附加到一个游戏物体的组件或脚本都可以通过GetComponent访问。
transform.Translate(0,1,0);
//等同于
GetComponent(Transform).Translate(0,1,0);
注意transform和Transform之间大小写的区别。前者是变量(小写),后者是类或者脚本名称(大写)。大小写不同使你能够从类和脚本名中区分变量。
应用我们所学,你可以使用GetComponent找到任何附加在同一游戏物体上的脚本和组件。请注意要使下面的例子能够工作,你需要有一个名为OtherScript的脚本,其中包含一个DoSomething函数。OtherScript脚本必须与下面的脚本附加到相同的游戏物体上。
//这个在同一个游戏物体上找到名为OtherScript的脚本
//并调用它上面的DoSomething.
function Updata(){
otherScript= GetComponent(OtherScript);
otherScript.DoSomething();
}
大多数高级的代码不仅需要操作一个物体。Unity脚本接口有各种方法来找到并访问其他游戏物体和组件。在下图,我们假定有一个名为 OtherScript.js的脚本附加到场景的游戏物体上。
var foo =5;
functionDoSomething(param:String){
print(param + ”with foo:” + foo);
}
1. 通过检视面板赋值引用。
你可以通过检视面板赋值变量到任何物体。
//变量拖动到target槽的物体
var target: Transform;
functionUpdate()
{
target.Translate(0,1,0);
}
你也可以在检视面板中公开到其他物体的引用。下面你可以一个包含 OtherScript的游戏物体到检视面板中的target槽。
//设置在检视面板中赋值的target变量上的foo,调用DoSomething.
vartarget:OtherScript;
functionUpdate()
{
//设置target物体的foo变量
target.foo = 2;
//调用target上的DoSomething
target.DoSomething(“Hello”);
}
2. 通过物体层定位。
对于一个已存在的物体,可以通过游戏物体的Transform组件来找到子和父物体:
//找到脚本所附加的
//游戏物体的子“Hand”
transform.Find(“Hand”).Translate(0,1,0);
一旦在层次视图中找到这个变换,你可以使用GetComponent来获取其他脚本,
//找到名为“Hand”的子。
//调用附加到它上面的OtherScript脚本的DoSomething.
transform.Form(“Hand”).GetComponent(OtherScript)DoSomething(“Hello”);
//找到名为”Hand”的子
//然后应用一个力到附加在hand上的刚体
transform.Find(“Hand”).rigidbody.AddForce(0,10,0);
你可以循环所有的子。
//变换的所有子向上移动10个单位
for(var child: Transform in transform)
{
child.Transform(0,1,0);
}
参考Transform类文档获取更多的信息
3. 根据名称或标签定位
你可以使用GameObject.FindWithTag和GameObject.FindGameObjectWithTag搜索具有特定标签的游戏物体。使用GameObject.Find根据名称查找物体。
functionStart()
{
//按照名称
var go = GameObject.Find(“SomeGuy”);
go.transform.Translate(0,1,0);
//按照标签
var player = GameObject.FindWithTag(“Player”);
player.transform.Transform(0,1,0);
}
你可以在结果上使用GetComponent,在找到的游戏物体上得到任何脚本或组件。
function Start()
{
//按名称
vargo = GameObject.Find(“SomeGuy”);
go.GetComponent(OtherScript).DoSomething();
//按标签
varplayer = GameObject.FindWithTag(“Player”);
player.GetComponent(OtherScript).DoSomething();
}
一些特殊的物体有快捷方式,如主相机使用Camera.main。
4. 作为参数传递
一些事件消息在事件中包含详细信息。例如,触发事件传递碰撞物体的Collider组件到处理函数。
OntriggerStay给我们一个碰撞器的引用。从这个碰撞器我们可以获取附加到其上的刚体。
functionOnTriggerStay(other : Collider){
//如果另一个碰撞器也有一个刚体
//应用一个力到它上面
if(other.rigidbody){
other.rigidbody.AddForee(0,2,0);
}
}
或者我们通过碰撞器获取附加在同一物体上的任何组件。
functionOnTriggerStay(other:Collider){
//如果另一个碰撞器附加了OtherScript
//调用它上面的DoSomething
//大多数时候碰撞器不会附加脚本
//所以我们需要首先检查以避免null引用异常
if(other.GerComponent(OtherScript)){
other.GetComponent(OtherScript).DoSomething();
}
}
注意通过上述例子中的other变量,你可以访问碰撞物体中的任何组件。
5一种类型的所有脚本
使用Object.FindObjectsOfType找到所有具有相同类或脚本名称的物体,或者使用Object.FindObjectOfType找到这个类型的第一个物体。
function Start()
{
//找到场景中附加了OtherScript的任意一个游戏物体
var other: OtherScipt = FindObjectOfType(OtherScript);
other.DoSomething();
}
来源:http://oulehui.blog.163.com/blog/static/796146982010611112655758/
Unity使用Vector3类统一表示全体3D向量。3D向量的不同组件可以通过x,y和z成员变量访问。
varaPosition:Vector3;
aPosition.x= 1;
aPosition.y= 1;
aPosition.z= 1;
你也可能够使用Vector3构造函数来同时初始化所有组件
varaPosition = Vector3(1,1,1);
Vector3也定义了一些常用的常量值。
vardirection = Vector3.up;//与Vector3(0,1,0);相同
单个向量上的操作可以使用下面方式访问:
someVector.Normalize();
使用多个向量的操作可以使用Vector3类函数:
theDistance= Vector3.Distance(oneVector,otherVector);
(注意你必须在函数名之前写Vector3.来告诉JS在哪里找到这个函数,这适用于所有类函数。)
你也可以使用普通数学操作来操纵向量。
combined =vector1 + vector2;
查看Vector3类文档获取完整操作和可用属性的列表。
概览:成员变量&全局变量
定义在任何函数之外的变量是一个成员变量。在Unity中这个变量可以通过检视面板来访问。任何保存在成员变量中的值也可以自动随工程保存。
varmemberVariable = 0.0;
上面的变量将在检视面板中显示名为”Member Variable”的数值属性。
如果你设置变量的类型为一个组件类型(例如Transform,Rigidbody,Collider,任何脚本名称,等等)。然后你可以在检视面板中通过拖动一个游戏物体来设置它们。
varenemy : Transform;
function Update()
{
if(Vector3.Distance(enemy.position,transform.position)<10){
print(“I sense the enemy is near”);
}
}
你也可以创建私有成员变量。私有成员变量可以用来储存那些在该脚本之外不可见的状态。私有成员变量不会被保存到磁盘并且在检视面板中不能编辑。当它被设置为调试模式时,它们在检视面板中可见。这允许你像一个实时更新的调试器一样使用私有变量。
privatevar lastCollider : Collider;
functionOnColliderEnter(collisionInfo : Collision){
lastCollider = collisionInfo.other;
}
全局变量
你也可以使用static关键字创建全局变量。
着创造了一个全局变量,名为someGlobal。
//TheScriptName.js中的一个静态变量
static var someGlobal = 5;
//你也可以在脚本内部像普通变量一样访问它
print(someGlobal);
someGlobal = 1;
为了从另一个脚本访问它,你需要使用这个脚本的名称上加上一个点和全局变量名。
print(TheScriptName.someGlobal);
TheScriptName.someGlobal = 10;
来源:http://oulehui.blog.163.com/blog/static/7961469820107934114974/
Unity 3d 引用 GUI QQ似展开
像QQ一样,你放上面 你鼠标放上去它会向下展开 .
var show = false;
var grow = false;
var min = 0.0;
var max = 50.0;
var height = 0.0;
var speed = 0.0;
//var skin:GUISkin;
function OnGUI ()
{
//GUI.skin = skin;
if(GUI.Button(Rect(5,5,104,25),"List"))
{
grow = true;
if(!show)
show = true;
}
if(show)
{
GUILayout.BeginArea(Rect(7,30,100,height),"","Box");
GUILayout.BeginVertical();
for(i = 0;i<8;i++)
GUILayout.Button(i+".Title");
GUILayout.EndVertical();
GUILayout.EndArea();
}
if(grow)
{
speed += Time.deltaTime*5.0;
height = Mathf.Lerp(min,max,speed);
if(Mathf.Approximately(height,max))
{
grow = false;
max = min;
min = height;
speed = 0.0;
if(min == 0)
show = false;
}
}
}
Unity 3d 给物体添加力
Unity 3D 2010-08-26 17:08:43 阅读62 评论0 字号:大中小 订阅
第一种:
this.gameObject.rigidbody.AddForce(0,0,5);
加力的方向和力度
第二种:
this.gameObject.rigidbody.AddForceAtPosition(ts.position -this.transform.position, transform.position,ForceMode.Impulse);
(力的目标,本身,力的类型)
引用 U3D屏幕截图
Unity 3D 2010-08-23 17:06:12 阅读58 评论0 字号:大中小 订阅
本文引用自博者《U3D屏幕截图》
引用
博者 的 U3D屏幕截图
function ScreenshotEncode()
{
// wait for graphics to render
yield WaitForEndOfFrame();
// create a texture to pass to encoding
var texture:Texture2D = new Texture2D (Screen.width,Screen.height, TextureFormat.RGB24, false);
// put buffer into texture
texture.ReadPixels(Rect(0.0, 0.0, Screen.width,Screen.height), 0.0, 0.0);
texture.Apply();
// split the process up--ReadPixels() and the GetPixels()call inside of the encoder are both pretty heavy
yield;
// create our encoder for this texture
var encoder:JPGEncoder = new JPGEncoder(texture, 75.0);
// encoder is threaded; wait for it to finish
while(!encoder.isDone)
yield;
// save our test image (could also upload to WWW)
File.WriteAllBytes(Application.dataPath +"/../testscreen-" + count + ".jpg", encoder.GetBytes());
count++;
}
//简便方法看下面:
function OnMouseDown() {
Application.CaptureScreenshot("Screenshot.png");
}
Unity 3d 射线(获得鼠标点击的坐标[x,y,z])
Unity 3D 2010-08-19 11:49:40 阅读134 评论0 字号:大中小 订阅
using UnityEngine;
using System.Collections;
public class Lu : MonoBehaviour
{
public Camera cam;
// We need to actually hit an object
RaycastHit hitt = new RaycastHit();
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
Ray ray =cam.ScreenPointToRay(Input.mousePosition);
Physics.Raycast(ray, out hitt, 100);
// Debug.DrawLine(cam.transform.position, ray.direction,Color.red);
if (null != hitt.transform)
{
print(hitt.point);//鼠标点击的坐标
}
}
}
Unity 3d 用代码脚本建造一堵Cube墙
Unity 3D 2010-08-17 10:26:59 阅读142 评论0 字号:大中小 订阅
C#版:
// Use this for initialization
void Start()
{
for (int y = 0; y < 5; y++)
{
for (int x =0; x < 5; x++)
{
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.AddComponent<Rigidbody>();
cube.transform.position = new Vector3(x, y, 0);
}
}
}
JS版:
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);
}
}
}
Unity 3d 里 Render Texture在屏幕中做小屏幕用
Unity 3D 2010-08-16 13:39:06 阅读181 评论2 字号:大中小 订阅
先做准备工作,我们要用到Render Texture.先创建一张rendertexture图片。
这时候这张照片是空的,因为我们没指定摄像机。在顶视图创建一个相机,调整好位置。在target texture 选项里,选择刚才创建的render texture。
这时候render texture 里面就有画面了。如图
接下来我们就要让它显示出来。代码如下:
var pic:RenderTexture;
function OnGUI () {
GUI.Box(Rect(0,Screen.height-100,100,100),pic);
}
Unity 3d 里有关时间延迟
Unity 3D 2010-08-11 16:11:42 阅读65 评论0 字号:大中小 订阅
IEnumerator WaitAndPrint(float waitTime)
{
// pause execution for waitTimeseconds
yield return newWaitForSeconds(waitTime);
print("----------------")
}
在其它方法里调用:
StartCoroutine(WaitAndPrint(3.0F));
好像在Update里不好用。没试。
暂停Time.timeScale = 0;
FixedUpdate功能将不会被调用时, 时间刻度设置为零。
untiy3d(运行性能)的美工方面需要知道的知识(二)
Unity 3D 2010-08-11 14:48:39 阅读90 评论0 字号:大中小 订阅
总体来说:合并,合并,合并!
如果你比较关心游戏的速度,请合并模型。最好能够把合并的模型使用同样的材质和贴图(材质也要合)。RenderingStatistics窗口时很有用的!
现在的图形显卡可以很好的支持很多的多边形,但是他们他们还是有一些瓶颈的。所以如果你有一个有100个三角形的MESH,它渲染起来所需要花费的运算跟1500个面数的物体是没有多大差别的。因此最佳的渲染设置时每个模型大约1500-4000个三角面。
只有在游戏组件中的属性栏中勾选MeshRenderer选项显卡才会渲染相应的模型,并且在场景中的空的GameObject组件是不会被渲染的。
所以再次重复,最好的导入渲染设置时合并Objects直到他们每个模型在1500个三角面面甚至更高一些,并且为整个模型使用一个材质。
如果只是把两个模型合并在一起但是不共同使用同一个材质并不会给你的图形带来一点优化。如果你想有效的合并物体,你需要保证你合并后的模型使用一个材质。(其实就是尽量减少材质球的数量)
在你合并物体的时候需要知道一件事:如果你在你的场景中用到了很多小的灯光,你可以把场景中离得很近的物体合并为一个Object。
按照上面的思路,如果一个MESH具有多个材质球,那就说明在计算机渲染的时候是要进行多重运算的。最普遍的你之所以一个MESH用多个材质的原因是因为两个材质不能使用相同的贴图。所以如果你想要优化渲染设置,你最好确定你合并的那些MESH的材质是相同的。
Unity对于向显卡导出各种多边形是很擅长的,它可以很详尽的把所有的图形导入到显卡,并且优化数据。你需要做的只是确定你的图形显示卡正常工作。而不是要调整很多手动调节的设置。
Thenumber of Pixel Lights affecting an object heavily affectsperformance. 相当数量的实时灯光对于游戏速度也是有限制的。
如果你想要有一个不错的展示,并且不关心凹凸贴图和实施灯光(Bumpmappingor Pixel Lighting),可以去Edit->RenderSettings...然后设置PixelLight Coun为0.这将会给所有的Object使用顶点灯光。这将会让所有的物件在每一帧都会被渲染一次。这是一个比较极端的LOD设置,所以你的游戏就可以再比较老的图形显卡下运行了。
Pixellights 像素灯光
如果你使用的是像素灯光,那么每个被这个灯光照射到的GameObject都会在每一帧被渲染一次。如果你合并了两个距离很远的物体,他就会增加物件的大小,然后你就会需要一些灯光来照亮这些物体。如果你的物件是分开的,灯光将不会渲染远处的物体,这将会导致模型得到多次渲染,相比较没有被合并的模型,我们并没有得到多少实惠。因此,如果你的GameObject中有很多独立物件的时候,你可以让他们离得比较远。
当渲染一个模型的时候,UNTIY如果发现很多灯光在MESH的周围,它将会找出那个是主要影响这个MSEH的灯光,在Edit->RenderSettings中的设置就是用来调整有多少个灯光最终作为像素灯光有多少作为顶点灯光。
每一个灯光通过计算离MESH得距离和自己灯光强度来决定自己的重要程度。
在游戏中的某些灯光是很重要的,所以,每一个灯光都会有一个RenderMode设置,这个用来设置哪一个可以被用来设置为ForcePixel 或者 ForceVertex.
想象一下假如我们是一个驾车的游戏,你的角色在夜晚打开车灯,前面的车灯就是游戏中最重要的灯光。因此,前大灯的渲染模式将会被设置为ForcePixel
当然如果你有一个不是很重要的灯光,也是选择使用"ForceVertex"的渲染模式,这个方式也不会对游戏的速度有很大的影响的。
影子
阴影普遍运算量比较大。如果运用得当,可以让游戏画面出色,你也可以乐队相关文档。
角色建模优化
你的角色应该只被用于一个蒙皮模型渲染器。当然有时候可能需要多个蒙皮的模型,但是如果你同时用两个蒙皮来作为一个角色,它就相当于你进行了两个角色的运算量。
你同样需要保持MESH的材质数量尽可能低。一般建议身体的材质数量为2-3个,当然如果你有武器的材质,也是需要单独一个的,因为你需要换武器。
减少骨骼的数量,一般来说游戏中的骨骼数量为15-60个。骨骼越少运行速度越快,一般来说30块骨骼就可以让角色动的很舒服了。如果你不是有特殊的设置,我们强烈建议每个角色30个骨骼。
多边形的数量主要是看你对游戏的质量要求,500-6000个三角面是比较推荐的。如果你的游戏场景中将会出现多个角色,那么就要适当的降低一下多边形数 量了。如果你想要在比较老的机器上运行,你需要更少的多边形数量。比如,半条命2游戏的角色通常是2500-5000个三角面。达到AAA标准的次时代游 戏比如像是PS3或者XBOX360上的游戏角色通常有5000-7000个三角面。
把IK控制器和FK控制器分离,当动画导入以后,IK的节点将会烘焙到FK上,其实UNITY并不需要IK节点,你可以删除它们。
创建一个公共的骨架,这样就可以让你让不同的角色之间共享动作了。
给每一个骨骼正确的命名,方便团队工作,也方便类似于Motionbuilder的动作软件,不然你得每次指定骨骼。
优化综合的图形卡
优化模型参数
使用尽量少的面
UV接缝的数量尽可能少
烘焙灯光
烘焙灯光到光照贴图或者到顶点颜色。
MAYA具有不错的制作光照贴图的工具,UNITY可以从MAYA中导入第二个UV贴图或者顶点颜色。
制作环境的光照贴图的流程要比直接在场景中打灯光要繁琐的多,但是
运行速度明显增快。
如果你使用全局光并且平滑光照贴图,可以让画面效果明显增强。
甚至次时代游戏比如战争机器始终在很多方面使用光照贴图。通常他们在场景中使用光照贴图,然后在上面放置一个动态灯光。在UNITY中也可以制作相应的光照贴图Shader.
来源于:http://hi.baidu.com/jdk900/blog/item/381acffea3e7993b5d6008df.html
untiy3d(性能)的美工方面需要知道的知识(一)
Unity 3D 2010-08-11 14:43:15 阅读131 评论0 字号:大中小 订阅
首先,向伟大的SAKARI团队致敬,他们的游戏真不错,我也想模仿一下。截图如下:
我其实在我桌子上的废纸上记录了很多相关的类似于上面的总结,结果因为是废纸,丢了很多,不过还好,很多脑袋里面还有点印象,趁着没忘干净,赶紧记录下来。
(下面是正文)
总结着来,不怎么有条理,凑活着看吧。
1.引擎没有说具体的面数限制,也许是跟VIRTOOLS一样的标准,按机器性能而定。
2.导入图形或者MESH的方法无非两种,一种是直接拷贝到文件目录下的Assets文件夹下面,Unity3d引擎会自动找到添加的文件,并且能在PROJECT面板中找到它。另一种是我们在PROJECT面板中用右键菜单,导入素材。
当然,我是用MAYA导入的,U3D引擎对于MAYA的支持还是不错的,但是也需要注意,不要用中文的目录结构,最好直接从MAYA的工程文件夹中导入,最好在导入MESH前先吧贴图文件放到相应的文件夹,或者相关文件夹的子文件夹。
在我们导入场景文件的时候,需要在导入设置中勾选创建碰撞,这样导入的场景我们就可以踩在上面了。(这跟我们添加碰撞组件是有些不同德)
3.Unity3d引擎支持大多数常用的贴图,比如漫反射贴图,高光贴图,法线贴图。如此一来,它就成了一个名副其实的次时代引擎了。当然与UNREAL引擎 的强大材质编辑器不同,U3D引擎主要是编辑材质的方式是使用一种专门的语言,类似于CgFX和Direct3D的语法。当然如果不是专门的图形程序员, 我们只要掌握相关的SHADER的使用方法就可以了。在我们安装完U3D引擎后,系统自带的SHADER足够我们日常大多数情况下使用了。如果我们还有特 殊的要求,可以去官网上下载相关的程序,然后把代码保存为.shader 的文件,放到相应的目录底下,然后我们就有了这种SHADER。
------------------------------------------------------------------
掌握并且理解了上面我说的乱七八糟的三点,你就可以作为一个U3D引擎的美工开始工作了。其中有几个需要我们进行深入探讨的几个方面:一是导入的MESH的要求,如何减面,UV的情况怎样,是否可以重叠UV。 二是导入的贴图规范,我们的各种贴图要达到怎样的程度才能导入,并不是直接拍了照片贴上就很有效果的,我们需要在三维软件中烘焙,之后才能导入。还有光照 贴图怎么制作。 三是各种材质的应用,比如说我们最常用在皮肤上的3S材质效果,如何在U3D引擎中实现这种效果?
至此,你可以轻松的驾驭U3D引擎的Assets部分了。(松了一口气,其实很简单)
然后我们要用引擎构建关卡。好吧现在你要成为一个U3D引擎的关卡设计师,当然这里面也有很多美工要做的事情。我们不用每天对着素材模型,贴图骂娘了。
作为关卡设计师,特别是U3D的,一定要有一个GAMEOBJECT的概念,在这个可爱引擎中,我们可以看到各种的元素都是由GAMEOBJECT组成的,在GAMEOBJECT上我们又可以添加组件在实现特定的功能,比如最简单的位移。我在第一次使用这个引擎的时候,突然兴致大发想要在场景中创建一盏灯,弄了半天都 没成,后来才明白,灯光是要附着在GAMEOBJECT上的。同理,声音也是要附着在这上面的。
还要有一个PREFABS得概念,就在层级菜单中的蓝色文字所代表的属性,其实就是在游戏中可以无限复制的意思,比如子弹,比如无数的需要出现的小物件儿。
类似于三维软件以及其他引擎,U3D的灯光分为那么普通的几类,电光源、方向光、自然光。了解灯光的属性和使用方法。
还有U3D引擎的物理系统。当我看到这个系统的时候我的心都开花了,一想到各种独立游戏中无敌的物理效果心里就暗爽。比如我们可以用最简单的方法做一个足球游戏。
********************
还是做游戏好,这个引擎能做网页游戏,也可以做PC单机游戏,网络游戏,也可以做IPHONE平台的手机游戏。真是万能了!
当然,上面很多都是初学时候的经验,下面是我后来加上的一些内容,是经过学习总结和辛苦翻译的。
让你的游戏能够顺畅的运行是成功的第一个要求。感谢UNTIY,他们通过大量的优化和调整可以让这个引擎发布的游戏运行于各种不同性能的硬件系统。下面是一个通用的优化游戏性能的方法。
来源于:http://hi.baidu.com/jdk900/blog/item/ed33fe00ce1fdb1b738b65d3.html
Unity 3d 拖拽物体的脚本
Unity 3D 2010-07-30 16:31:52 阅读83 评论0 字号:大中小 订阅
function OnMouseDown () {
var screenSpace = Camera.main.WorldToScreenPoint(transform.position);
var offset = transform.position -Camera.main.ScreenToWorldPoint(Vector3(Input.mousePosition.x,Input.mousePosition.y, screenSpace.z));
while (Input.GetMouseButton(0))
{
var curScreenSpace = Vector3(Input.mousePosition.x, Input.mousePosition.y,screenSpace.z);
var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
transform.position = curPosition;
yield;
}
}
Unity 3d <=实时阴影减少锯齿
Unity 3D 2010-07-28 17:16:38 阅读175 评论0 字号:大中小 订阅
这是我看《叫你自由》的视频后写的。多谢
=====================================================================
实时阴影的资源优化
如何减少锯齿感?
1. 合理设置斜面常量的数值
在灯光里调
Shadows->Constant Bias
->ObjectSize Bias
这两个是斜面常量数值,主要是调解自身的锯齿
2. 尽量减小被投射阴影物体的面积(光投射的面积,越小越好)
3. 不考虑资源的情况下,尽量使用大阴影贴图
贴图尺寸:Edit->project settings->Quality
这就是运行exe文件时的选择质量
就以Good为例:
Shadows
ShadowResolution
这个就是贴图的分辨率
LowResolution
MediumResolution 默认
HighResolution 设置这个效果会好些
ShadowCascades
这个就是第四点要说的级别
NoCascades
TwoCascades默认 (把细节与宏观分开)
Four Cascades 设置成4级
ShadowDistance
(第5点)这个就是显示阴影的距离,镜头远处的阴影不会显示
AntiAliasing 默认为Disabled(无)第7点
Disabled
2x MultiSampling
4x MultiSampling
8x MultiSampling
16x MultiSampling
根据机器配置选择。
4. 使用4级阴影贴图
5. 尽量减小阴影对摄影机的可见距离
6. 软阴影可达到抗阴影锯齿效果
软阴影在灯光里调
Shadows->Type 阴影的类型
No Shadows 默认无
HardShadows
SoftShadows 选择这个软阴影
7. 系统抗锯齿打开后,也会有少许效果
Unity 3d 物体运动到指定位置(X,Y,Z)
Unity 3D 2010-07-28 17:11:11 阅读70 评论0 字号:大中小 订阅
int smooth = 2;
Quaternion target = Quaternion.Euler(0, 0, 0);//目标
// Dampentowards the target rotation
transform.rotation = Quaternion.Slerp(transform.rotation, target,Time.deltaTime * smooth);
控制GUI Texture的位置,置顶、置底、靠左、靠右、全屏的JS
Unity 3D 2010-07-21 14:03:09 阅读115 评论0 字号:大中小 订阅
var Relative : boolean ;
var Top : boolean ;
var Right : boolean ;
function OnGUI() {
otherScript = GetComponent(GUITexture);//将GUITexture传递过来
thetexture = otherScript.texture;//获取GUITexture的纹理
if (Relative == true ){
if (thetexture.width >thetexture.height) {
W = Screen.width;
H =(Screen.width*thetexture.height)/thetexture.width;
} else {
W =(Screen.height*thetexture.width)/thetexture.height;
H = Screen.height;
}
} else {
W = thetexture.width ;
H = thetexture.height ;
}
if (Top == true ){
Y = Screen.height - H;
} else Y = 0 ;
if (Right == true ){
X = Screen.width -W;
} else X = 0;
otherScript.pixelInset = Rect (X,Y,W,H);
//print (otherScript.pixelInset );
}
没使用前:
全屏按比例缩放:
置顶:
置顶、靠右:
来源于:http://www.anyfar.com/article/Unity3D/30.htm
Unity 3d 拖动GUI(拖动图片)
Unity 3D 2010-07-14 14:20:00 阅读67 评论0 字号:大中小 订阅
var windowRect = Rect (20, 20, 120, 50);
function OnGUI () {
// Register the window.
windowRect = GUI.Window (0, windowRect, DoMyWindow, "My Window");
}
// Make the contents of the window
function DoMyWindow (windowID : int) {
// Make a very long rect that is 20 pixels tall.
// This will make the window be resizable by the top
// title bar - no matter how wide it gets.
GUI.DragWindow (Rect (0,0, 10000, 20));
}
根据这个内容可以想到鼠标点击拖动图片::
varimage:Texture;
var guiTexture:Rect;
functionAwake()
{
guiTexture.width=image.width;
guiTexture.height=image.height;
}
function OnGUI()
{
guiTexture=GUI.Window(0,guiTexture,popWin,"");
}
function popWin(winId:int)
{
GUI.DrawTexture(Rect(0,0,guiTexture.width,guiTexture.height),image);
GUI.DragWindow();
}
让js编辑器SciTEG永久支持中文
Unity 3D 2010-07-13 15:00:15 阅读51 评论0 字号:大中小 订阅
今天收获真不小实在忍受不了 每次打开都要设置uncode==utf-8 尝试修改了些属性果然实现了
假如你的代码中有中文这个设置是很爽的。以后注释也可以中文了。
说方法:
1.用记事本打开D:\ProgramFiles\Unity\Editor\Data\Tools\UniSciTE\SciTEGlobal.properties
//你装的路径
2.找到# Internationalisation这一行下面的都是设置编码的(鄙视一下居然是Japanese )
3.可以把下面这段的都删除掉 到#output.code.page=65001这里
然后把下面粘贴到这个位置(改把chinese 作为注释 )
4.大功告成 。试一下打些中文然后选择中文 如果不乱码(不改这个选择中文会乱码) 恭喜你成功!
===========================================================================
#Internationalisation
# Chinese input code page 936 and Chinese character set 136
code.page=936
character.set=136
# Unicode
code.page=65001
character.set=136
# Required for Unicode to work on GTK+:
LC_CTYPE=en_US.UTF-8
output.code.page=65001
======================================================================================
来源于:http://www.iu3d.com/viewtopic.php?f=22&t=67
让Unity的脚本编辑器默认显示行号
Unity 3D 2010-07-13 14:22:05 阅读61 评论0 字号:大中小 订阅
U的脚本编辑器默认是不显示行号的,每次打开都要勾选,很麻烦,刚刚发现一个办法可以修改编辑器的设置,首先找到编辑器的配置文件,比如:我的配置文件路径
D:\Unity\Editor\Data\Tools\UniSciTE\SciTEGlobal.properties
找到之后用文本编辑器打开它,让后在里面随便哪一行加上这句
line.margin.visible=1
保存一下再重新打开编辑器看看.
U3d唤醒的数学知识
Unity 3D 2010-07-13 13:54:38 阅读49 评论0 字号:大中小 订阅
太久没运用几何知识了,u3d也确实封装掉了太多的知识,搞得就只会用函数而不懂原理了,很多公式一时还真记不起来,这几天居然拿出了纸在推导一些公式,以怀念我从小学到大学值得骄傲的数学知识。
1.角度与弧度互转(别告诉我连弧度是什么你都不知道了)
弧度=角度*3.14159f/180.0f
角度=弧度*180.0f/3.14159f
向量旋转应用:
static function RotateTowards (from :Vector3, to : Vector3, maxRadiansDelta : float, maxMagnitudeDelta : float) :Vector3
解释:将向量from向to向量旋转maxRadiansDelta弧度变化maxMagnitudeDelta幅度(长度)。
maxRadiansDelta是选择的弧度(不是角度哦)
2.向量旋转(之前不懂上面那个函数的时候,到处找公式自己写旋转-.-)
对于p = (x,y)这个向量向逆时针旋转且大小不改变所得到的向量如下:
p: (x,y) --------> p': (x*cos(d)-y*sin(d) , x*sin(d)+y*cos(d) )
如果是向顺时针旋转则:
p: (x,y) --------> p': (x*cos(-d)-y*sin(-d) , x*sin(-d)+y*cos(-d) )
3.向量相乘
点乘,得到的是内积是实数
差乘,得到的是外积是向量,垂直于原向量的平面(右手法则)
向量a·向量b=a1a2+b1b2+c1c2
向量a×向量b=
| i j k|
|a1 b1 c1|
|a2 b2 c2|
=(b1c2-b2c1,c1a2-a1c2,a1b2-a2b1)
4.复数乘法的几何意义(这个才叫困扰我n久的东西,阿杜当年也不重点讲下-,-)
复数乘法(叉乘)的几何意义实际上就是对复数进行旋转
对最简单的复数p= x + yi来说,和另一个复数q = ( conα,sinα)相乘,则表示把p沿逆时针方向旋转α:
p’ = pq
来源于:http://www.iu3d.com/viewtopic.php?f=24&t=100
控制输入系统 - Input 类实例讲解
Unity 3D 2010-07-13 13:39:59 阅读49 评论0 字号:大中小 订阅
获取键盘某一(这里是空格键)按键状态(bool):Input.GetKeyDown(KeyCode.Space)这是最不通用的写法,不推荐
获取虚拟按键(这里是Jump)按键状态(bool):Input.GetButton("Jump")推荐用这种写法,用户可以设置按键Jump为空格键(默认就是空格)
获 取遥感(或iphone感应)垂直轴力度(是一个0-1之间的float):Input.GetAxis("Vertical“) 推荐写法,键盘的话默认按w或者up会瞬间提到1,要是遥感的话可以控制一个度,再乘以力的方向向量的话,就可以控制汽车之类的加速了。如果你直接写成键 盘的w或者d,那就没办法控制力度了。
获取遥感(或iphone感应)水平轴力度(同上):Input.GetAxis("Horizontal")
获取鼠标中键状态:Input.GetAxis("MouseScrollWheel")
注:有些遥感可能水平方向会转超过1或者小于0的值出来(例如汽车遥感),为了避免错误的计算(乘以负数的话向量的方向可是会相反的),可以配合数学函数Mathf.Clamp01()来固定他的值在0和1之间。例如:
motor = Mathf.Clamp01(Input.GetAxis("Vertical")); //设置汽车引擎力度为垂直方向力度
用于挥动的旗帜效果(shader)
Unity 3D Shader 2010-07-13 10:36:46 阅读104 评论0 字号:大中小 订阅
//Original shader by cboe - Mar, 23, 2009
// Enhanced to 3 axis movement by Seon - Jan, 21, 2010
//
// Requirements: assumes you are using a subdivided plane created with X (width)* Z (height) where Y is flat.
// Requirements: assumes UV as: left X (U0) is attatched to pole, and Top Z(V1) is at top of pole.
//
// Enjoy!
Shader "Selfmade/FlagWave"
{
Properties
{
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Texture", 2D) = "white" { }
}
SubShader
{
Pass
{
CULL Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "AutoLight.cginc"
float4 _Color;
sampler2D _MainTex;
// vertex input: position, normal
struct appdata {
float4 vertex : POSITION;
float4 texcoord : TEXCOORD0;
};
struct v2f{
float4 pos : POSITION;
float2 uv: TEXCOORD0;
};
v2fvert (appdata v) {
v2fo;
floatsinOff=v.vertex.x+v.vertex.y+v.vertex.z;
float t=-_Time*50;
float fx=v.texcoord.x;
float fy=v.texcoord.x*v.texcoord.y;
v.vertex.x+=sin(t*1.45+sinOff)*fx*0.5;
v.vertex.y=sin(t*3.12+sinOff)*fx*0.5-fy*0.9;
v.vertex.z-=sin(t*2.2+sinOff)*fx*0.2;
o.pos = mul( glstate.matrix.mvp, v.vertex);
o.uv = v.texcoord;
return o;
}
float4 frag (v2fi) : COLOR
{
half4 color = tex2D(_MainTex, i.uv);
return color;
}
ENDCG
SetTexture [_MainTex] {combine texture}
}
}
Fallback "VertexLit"
}
鼠标控制object
Unity 3D 2010-07-13 10:14:14 阅读43 评论0 字号:大中小 订阅
你鼠标转换的position是没有z值的,用鼠标控制物体的方法:
//var target : Transform;
var distance = 20.0;
var mySpeed = 250.0;
private var x = 0.0;
private var y = 0.0;
private var z = 0.0;
var xMinLimit=30;
var xMaxLimit=120;
var yMinLimit=30;
var yMaxLimit=120;
var zMinLimit=30;
var zMaxLimit=120;
function Start () {
var angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
z = angles.z;
}
function LateUpdate () {
if (Input.GetMouseButton(0)){
// x += Input.GetAxis("Mouse X") * mySpeed * 0.02;
// x = ClampAngle(x, xMinLimit, xMaxLimit);
y -= Input.GetAxis("Mouse Y") * mySpeed ;
y = ClampAngle(y, yMinLimit, yMaxLimit);
// z += Input.GetAxis("Mouse Y") * mySpeed * 0.02;
// z = ClampAngle(z, zMinLimit, zMaxLimit);
}
var rotation = Quaternion.Euler(x, y, z);
transform.rotation = rotation;
// var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;
// transform.position = position;
}
static function ClampAngle (angle : float, min : float, max : float) {
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp (angle, min, max);
}
代码完全可用:使用方法就是你把脚本放进你的物体里就可以用鼠标控制。
来源于:http://www.iu3d.com/viewtopic.php?f=16&t=235
GUI中的图片跟随鼠标旋转,鼠标用图片代替
Unity 3D 2010-07-13 09:50:40 阅读55 评论0 字号:大中小 订阅
最近要做一款类似于“祖玛”的游戏,要用到一张图像跟随鼠标旋转。所以研究了一下图片跟随鼠标旋转。
代码不多,主要代码就是旋转角度的计算。
var Mid : Texture2D;
var mouse : Texture2D; //鼠标图片
var mousePs = Vector2.zero; //鼠标的位置
private var angle : float;
function Update () {
mousePs = Input.mousePosition;//获取鼠标位置
angle = 180 - Mathf.Atan2(mousePs.x - 250,Screen.height -mousePs.y - 250) * Mathf.Rad2Deg;//计算选择角度
}
function OnGUI () {
Screen.showCursor = false;
GUIUtility.RotateAroundPivot (angle, Vector2(250,250));
GUI.DrawTexture(Rect(200,200,100,100),Mid);
GUIUtility.RotateAroundPivot (-angle,Vector2(250, 250));
GUI.DrawTexture(Rect(mousePs.x,Screen.height -mousePs.y,25,25),mouse);
}
来源于:http://www.iu3d.com/viewtopic.php?f=18&t=9
说明帮助GUI的制作(可以开关图片或视频)
Unity 3D 2010-07-13 09:41:14 阅读44 评论0 字号:大中小 订阅
GUI.Toggle()
gui001.jpg(64.66 KiB) 被浏览 206 次
var mystyle : GUIStyle;
//定义了GUI自己更换皮肤的功能。
var GUIx =100;
var GUIy =10;
var GUIyup =22;
var GUIw =90;
var GUIh =20;
var toggleBool = true;
//设置一个可见开关,并初始化为true正确。
function OnGUI ()
{
toggleBool = GUI.Toggle (Rect (Screen.width-GUIx,GUIy+GUIyup*5,GUIw,GUIh),toggleBool, "help",mystyle);
//创建一个GUI开关并等于自定义属性toggleBool项目。
GetComponent(GUIBoxRender).enabled = toggleBool;
//这个开关决定GUIBoxRender这个名字的脚本是否使用。
}
制作一个GUI开关,即Toggle按钮,这个GUI的功能是通过点击来传输true和false的功能,其输入Boolean类型。它不同于按钮Button属于执行程序功能。这个开关决定两种结果,即对和错。而Button只是决定是否启用程序,注意区分。
其中GetComponent(GUIBoxRender).enabled这个的翻译是“获得程序脚本文件(文件名).是否允许使用”如果输入的结果是true,那么这个脚本会使用。如果输入的是false,那么这个脚本就会关闭(但不删除)。
注意:这个GetComponent(GUIBoxRender).enabled只使用于GUI脚本,对于物体的开关需要使用renderer.enable并将脚本落在物体上。
注意:文件名的大小写和格式不能出错。
GUI
var mystyle : GUIStyle;
var GUIx =200;
var GUIy =10;
var GUIyup =22;
function OnGUI ()
{
GUI.Button (Rect(Screen.width-GUIx,GUIy+GUIyup*6,200,227),"",mystyle);
}
这个很简单,主要创建一个开关,开关除了具有按钮功能,还具有添加图片功能。并且分辨率和清晰度远远高于Teture 2D以及GUITexture的效果。
我们只要在Mystyle的属性中的Normal中添加一个贴图即可,注意GUI.Button的大小要与制作的贴图大小一致,可以允许比例缩小。
来源:http://www.iu3d.com/viewtopic.php?f=18&t=110
转帖机器人,不回站内短信
GUI里面图片的旋转(附带钟表例子)
Unity 3D 2010-07-13 09:34:39 阅读31 评论0 字号:大中小 订阅
以前一直不知道在GUI里面画出的图片可以旋转,所以遇到想要旋转图片时,都是把图片贴到一个面片上,旋转面片,很是不方便,最近发现在GUI里是可以旋转图片的,所以写到这里分享给大家。下面贴一个例子,利用图片旋转写的一个钟表的代码,不废话,直接上代码。
var Tu1 : Texture2D;
var Time1 : float = 0;
function FixedUpdate () {
Time1 += Time.deltaTime;
}
function OnGUI () {
GUI.Label(Rect(250,170,161,62),getTime(Time1));
GUIUtility.RotateAroundPivot (6*Time1,Vector2(103, 200));
GUI.DrawTexture(Rect(100,100,6,100),Tu1);//秒针
GUIUtility.RotateAroundPivot (-6*Time1,Vector2(103, 200));
GUIUtility.RotateAroundPivot (0.1*Time1,Vector2(103, 200));
GUI.DrawTexture(Rect(100,120,6,80),Tu1);//分针
GUIUtility.RotateAroundPivot(-0.1*Time1, Vector2(103, 200));
GUIUtility.RotateAroundPivot(0.1/60*Time1, Vector2(103, 200));
GUI.DrawTexture(Rect(100,140,6,60),Tu1);//时针
GUIUtility.RotateAroundPivot(-0.1/60*Time1, Vector2(103, 200));
}
function getTime(time : float) : String{
if(time<0){
return "00:00:00";
}
var lastTime : String = "";
var hour = Mathf.FloorToInt(time/3600%24);
if(hour/10 >=1){
lastTime+="" + hour;
}else{
lastTime +="0" + hour;
}
var minute = Mathf.FloorToInt(time/60%60);
if(minute/10 >=1){
lastTime+=":" + minute;
}else{
lastTime +=":0" + minute;
}
var second = Mathf.FloorToInt(time%60);
if(second/10 >=1){
lastTime+=":" + second;
}else{
lastTime +=":0" + second;
}
return lastTime;
}
简单介绍一下代码
GUIUtility.RotateAroundPivot (6*Time1,Vector2(103, 200))为旋转GUI的代码,第一个参数为旋转的角度,第二个参数为旋转的中心点,在它之下的GUI元素都会执行该旋转,例如图片、文字等。当你只想旋 转某一GUI元素而其他元素不旋转事就得给它一个停止旋转的代码,很简单,停止旋转时给它一个反向的角度,ok。
为了便于测试,在钟表左边给出一个数字时间经行对比。getTime(time : float)可用于实现场景中时间的显示,或者倒计时的显示等,需要的直接拿走,哈哈哈~
来源于:http://www.iu3d.com/viewtopic.php?f=18&t=8
在Unity中显示外部导入的txt文件
Unity 3D 2010-07-12 16:33:26 阅读48 评论0 字号:大中小 订阅
var TipsText1 : String = "测试测试……";
var TipsText2 : TextAsset;
var GUISkin1 : GUISkin;
function OnGUI () {
GUI.skin = GUISkin1;
GUI.Label(Rect(10,10,500,500),TipsText2.text);
//~ GUI.Label(Rect(10,10,500,500),TipsText1);
}
在Inspector面板中把想显示的.txt内容拖到TipsText2 里。
但是要注意的一点,从外部导入的txt文档要在Unity中重新设置一下,保证它是UTF-8的格式。
目前TextAsset支持的文件格式有.html、.htm、.txt、.xml
来源http://bbs.vrsh.cn/thread-3547-1-17.html
屏幕的大小和GUI调用JS方法
Unity 3D 2010-07-07 17:17:55 阅读51 评论0 字号:大中小 订阅
public var mySkin:GUISkin;
private var wholes=false;
private var s_width:int;
private var s_height:int;
private var select=true;
function Start(){
s_width=Screen.width;
s_height=Screen.height;
}
function Update () {
//获取播放屏幕的大小
s_width=Screen.width;
s_height=Screen.height;
if(wholes){
//设置成全屏
Screen.fullScreen=!Screen.fullScreen;
wholes=false;
select=!select;
}
}
function CreateWindow(windowID : int){
GUI.skin = mySkin;
if(select) {
wholes=GUI.Button(Rect(0,0,200,50),"quanping");
}else{
wholes=GUI.Button(Rect(0,0,200,50),"tuichu");
}
if(GUI.Button(Rect(0,50,200,50),"open")){
Application.ExternalCall( "openwin", "The game sayshello!" );//调用JS里的方法
}
}
function OnGUI () {
GUI.skin = mySkin;
SliderWindowRect = GUI.Window(3,Rect(s_width-500,s_height-200,300,100),CreateWindow,"");
}
GUIStyle
Unity 3D 2010-07-05 14:35:35 阅读67 评论0 字号:大中小 订阅
Name 名称 | The text string that can be used to refer to this specific Style文本字符串,可以用来指这一特定风格 |
Normal 正常 | Background image & Text Color of the Control in default state背景图片及文字颜色控制在默认状态 |
Hover 徘徊 | Background image & Text Color when the mouse is positioned over the Control背景图片及文字颜色,当鼠标在定位控制 |
Active 活跃 | Background image & Text Color when the mouse is actively clicking the Control背景图片及文字颜色,当鼠标点击控制,积极 |
Focused 聚焦 | Background image & Text Color when the Control has keyboard focus背景图片及文字颜色,当控制了键盘焦点 |
On Normal 对正常 | Background image & Text Color of the Control in enabled state背景图片及文字颜色控制在启用状态 |
On Hover 论悬停 | Background image & Text Color when the mouse is positioned over the enabled Control背景图片及文字颜色,当鼠标定位在启用控制 |
On Active 主动 | Properties when the mouse is actively clicking the enabled Control属性是当鼠标点击启用积极控制 |
On Focused 关于聚焦 | Background image & Text Color when the enabled Control has keyboard focus背景图片及文字颜色,当启用了键盘控制焦点 |
Border 边境 | Number of pixels on each side of the Background image that are not affected by the scale of the Control' shape像素数对每个形状的一面背景图像是'不影响控制规模的 |
Padding 填充 | Space in pixels from each edge of the Control to the start of its contents.每个空间的控制优势,其内容开始像素。 |
Margin 边 | The margins between elements rendered in this style and any other GUI Controls.元素之间的利润呈现在这种风格和任何其他的GUI控件。 |
Overflow 溢出 | Extra space to be added to the background image.要添加额外的空间的背景图片。 |
Font 字体 | The Font used for all text in this style字体用于所有在此样式的文本 |
Image Position图像位置 | The way the background image and text are combined.该方法的背景图片和文字相结合。 |
Alignment 对准 | Standard text alignment options.标准文本对齐选项。 |
Word Wrap 自动换行 | If enabled, text that reaches the boundaries of the Control will wrap around to the next line如果启用,文本,达到了控制的范围将环绕到下一行 |
Text Clipping 文本剪辑 | If Word Wrap is enabled, choose how to handle text that exceeds the boundaries of the Control如果启用了自动换行,选择如何处理文本,超过控制界限的 |
Overflow溢出 | Any text that exceeds the Control boundaries will continue beyond the boundaries任何文本超出了控制范围将继续超越国界 |
Clip 夹 | Any text that exceeds the Control boundaries will be hidden任何文本超出控制界限将被隐藏 |
Content Offset内容偏移 | Number of pixels along X and Y axes that the Content will be displaced in addition to all other properties沿X和Y轴的像素数量,该内容将在除所有其他属性流离失所 |
X X | Left/Right Offset左/右偏移 |
Y ? | Up/Down Offset向上/向下偏移 |
Fixed Width 固定宽度 | Number of pixels for the width of the Control, which will override any provided Rect() value像素数为覆盖宽度的控制,这将提供的任何矩形()值 |
Fixed Height 固定高度 | Number of pixels for the height of the Control, which will override any provided Rect() value像素数为重写高度的控制,这将提供的任何矩形()值 |
Stretch Width 弹力宽 | If enabled, Controls using this style can be stretched horizontally for a better layout.如果启用,控制使用这种风格可以横向延伸为一个更好的布局。 |
Stretch Height伸展高度 | If enabled, Controls using this style can be stretched vertically for a better layout.如果启用,控件可以使用这种风格的纵向延伸为一个更好的布局。 |
http://blog.163.com/lnwanggang@yeah/blog/static/16533216220106523535136/
U3D换贴图
Unity 3D 2010-07-05 13:38:41 阅读68 评论0 字号:大中小 订阅
//如果做家具换贴图,直接把这段代码加在要换贴图的模型上即可;
var textures : Texture2D[]; //声明一个数组型的图片库;
private var i : float = 0; //声明i为浮点数0;
function Update ()
{
if ("这里写上发生这个事件的条件")
{
i++ //切换图片
}
renderer.material.mainTexture = textures[i];
}
角色的上下左右移动用GUI来操作
Unity 3D 2010-07-05 13:32:18 阅读57 评论0 字号:大中小 订阅
有的客户要求做触摸屏,所以做了这些。废话少说,上图、上码。
Screen control.js内:
var ButtonsActive = true;
var speed = 15.0;
function OnGUI () {
if (ButtonsActive) {
if(GUI.RepeatButton(Rect(Screen.width/2,(Screen.height-45),40,40),"S")){
var tS = Time.deltaTime * speed;
transform.Translate(0,0,-tS);
}
if( GUI.RepeatButton(Rect(Screen.width/2,(Screen.height-90),40,40),"W")){
var tW = Time.deltaTime * speed;
transform.Translate(0,0,tW);
}
if(GUI.RepeatButton(Rect(Screen.width/2-48,(Screen.height-45),40,40),"A")){
var tA = Time.deltaTime * speed;
transform.Translate(-tA,0,0);
}
if(GUI.RepeatButton(Rect(Screen.width/2+48,(Screen.height-45),40,40),"D")){
var tD = Time.deltaTime * speed;
transform.Translate(tD,0,0);
}
}
}
function Update () {
if (Input.GetKeyDown("3")) {
ButtonsActive = true;
} else if (Input.GetKeyDown("4")) {
ButtonsActive = false;
}
}
来源于:http://bbs.vrsh.cn/thread-2684-1-5.html
在Unity中设置自定义的GUI样式(方法一:只使用一个样式)
Unity 3D 2010-07-05 12:38:04 阅读122 评论0 字号:大中小 订阅
首先,我们准备两张按钮状态的图片,最好是psd或者png等有透明通道的按钮,否则你无法做外发光效果和半透明效果了。我把我准备的按钮发上来。
大家估计看出来了,一个是平时的样式,一个是点击的样式。
接下来就是见证奇迹的时刻。。写代码的时刻。新建一个js脚本,并且把下面代码写进去。
var mystyle : GUIStyle; //定义GUIStyle类型的变量 mystyle
function OnGUI () {
GUI.Button(Rect(0,0,124,52),"",mystyle);//绘制一个按钮,大小要参考按钮图片的分辨率。起始位置为屏幕左上角,按钮内不要文字,使用mystyle样式
}
保存,并且把js给到场景中任何一个gameobject上,你会发现,这个脚本下面多出了好多选项。
ok,按下图把图片给到相应位置,其他的保持默认:
好了,这是试试运行一下场景吧,效果应该出来了吧?
来源于:http://bbs.vrsh.cn/thread-2144-1-3.html
GUI(一)关于gui.window gui.button Scrollview(滚动视图)
Unity 3D 2010-07-05 11:47:52 阅读103 评论0 字号:大中小 订阅
var scrollVec : Vector2;
var cls:boolean=false;
function OnGUI(){
GUI.Window(0, Rect(Screen.width-100, 35, 100, 220 ), windowF,"Management");
if(cls)
GUI.Window(1, Rect (150, 50, 200, 200), windowjj, "Warehouse");
}
function windowF(){
GUILayout.BeginArea(Rect(4, 20, 90, 170));
scrollVec = GUILayout.BeginScrollView(scrollVec);
if(GUILayout.Button ("Warehouse"))
cls=true;
GUILayout.Button("Start");
GUILayout.Button("Fighting");
GUILayout.Button("Back");
GUILayout.Button("1");
GUILayout.Button("2");
GUILayout.Button("3");
GUILayout.Button("4");
GUILayout.Button("5");
GUILayout.Button("6");
GUILayout.Button("7");
GUILayout.Button("8");
GUILayout.EndScrollView();
GUILayout.EndArea();
GUI.DragWindow();
}
function windowjj(){
GUILayout.BeginArea(Rect(130, 160, 50, 130));
if(GUILayout.Button("Close")) cls=false;
GUILayout.EndArea();
}
Unity 3d 在JS里间隔时间调用方法
Unity 3D 2010-07-05 11:30:31 阅读101 评论1 字号:大中小 订阅
var text2d:Texture2D[];//放图片的数组
private static var i:int=0;
public var TheTime:float=0.1;播放图片的间隔
InvokeRepeating("test",0,TheTime);
function Update () {
}
function OnGUI(){
GUI.Label(Rect(10,10,10,10),text2d[i]);
}
function test(){
if(i<text2d.length-1){
i++;
}
else{
i=0;
}
}
接受博友的意件!
方法二:
// Launches a projectile in 2 seconds
var projectile : Rigidbody;
Invoke("LaunchProjectile", 2);
function LaunchProjectile () {
instance = Instantiate(prefab);
instance.velocity = Random.insideUnitSphere * 5;
}
每隔2秒时间调用方法LaunchProjectile
Unity 3d界面汉化图解
Unity 3D 2010-06-17 17:13:51 阅读261 评论0 字号:大中小 订阅
图解来自http://vrsh.cn
Unity 3d 后代生成LineRenderer;线
Unity 3D 2010-06-17 16:59:30 阅读66 评论0 字号:大中小 订阅
var aMaterial:Material;
private var mLine:LineRenderer;
function Start ()
{
mLine = this.gameObject.AddComponent(LineRenderer);
mLine.SetWidth(5, 5);
mLine.SetVertexCount(300);
mLine.SetColors (Color.yellow,Color.yellow);
mLine.material = aMaterial;//材质
mLine.material.color = Color (0, 1, 0, 0.25);
mLine.renderer.enabled = true; //启用
}
var i:int=0;
function Update()
{
if(i<300)
{
mLine.SetPosition(i,Input.mousePosition);//鼠标坐标
}
i++;
}
Unity 3D 里的物体消失和显示新建
Unity 3D 2010-06-12 10:50:42 阅读62 评论0 字号:大中小 订阅
var sphere1 :Transform;
function Update () {
}
function Start()
{
yield WaitForSeconds(3.0);
GameObject.Destroy(this.gameObject);
GameObject.Instantiate(sphere1,transform.position,transform.rotation);
}
各种语言的转换
Unity 3D 2010-06-11 15:25:49 阅读51 评论0 字号:大中小 订阅
WPF to Unity 3D__GUI
http://www.zelk.com/XamlWindowGeneratorHelpMain.aspx
javascript to C#:
http://m2h.nl/files/js_to_c.php
Unity 3D_GUI_Controls控制
Unity 3D 2010-06-10 17:31:18 阅读429 评论0 字号:大中小 订阅
Label
The Label isnon-interactive. 该标签非交互式。
Itis for displayonly. 它是仅用于显示。
Itcannot be clicked or otherwise moved. 它不能被点击或以其他方式移动。
Itis best for displaying information only. 最好是仅用于显示信息。
/* GUI.Label example */ / * GUI.Label例如* / function OnGUI () { GUI.Label (Rect (25, 25, 100, 30), "Label"); } 按钮 该按钮是一个典型的互动按钮。 It will respond a single time when clicked, no matter how long the mouse remains depressed.它会回应一个单时点击,无论多久鼠标仍然低迷。 The response occurs as soon as the mouse button is released.该反应发生只要鼠标按钮被释放。
BasicUsage 基本用法
InUnityGUI, Buttons will return true when they are clicked.
Toexecute some code when a Button is clicked, you wrap the the GUI.Buttonfunction in an if statement.
Insidethe if statement is the code that will beexecuted when the Button is clicked.
在UnityGUI,按钮将返回 true时,点击。
/*GUI.Button example*/ / *GUI.Button例如*/
function OnGUI () { if (GUI.Button (Rect (25, 25, 100, 30), "Button")) { // This code is executed when the Button is clicked } }
RepeatButton
该RepeatButton 控制是一个互动,可编辑的单行字段包含一个文本字符串。
Basic Usage 基本用法
TheTextField will always display astring.RepeatButton 将始终显示一个字符串。
Youmust provide the string to be displayed in theTextField. 您必须提供的字符串在TextField中显示。
Whenedits are made to the string, the TextField function will return the editedstring.
当编辑是向字符串,函数将返回的TextField编辑字符串。
/* GUI.TextField example */ / * GUI.TextField例如* / var textFieldString = "text field"; function OnGUI () { textFieldString = GUI.TextField (Rect (25, 25, 100, 30), textFieldString); } TextArea textarea 控制是一种互动的,可编辑多线地区包含一个文本字符串。
Basic Usage基本用法
TheTextArea will always display astring. textarea将始终显示一个字符串。
Youmust provide the string to be displayed in theTextArea. 您必须提供的字符串显示在文本区。
Whenedits are made to the string, the TextArea function will return the editedstring.
当编辑是向字符串,文本区函数将返回编辑字符串。
/* GUI.TextArea example*/ / * GUI.TextArea例如* /
var textAreaString = "text area"; function OnGUI () { textAreaString = GUI.TextArea (Rect (25, 25, 100, 30), textAreaString); } Toggle 该Toggle 控制创建持久的一个复选框一个开/关状态。 The user can change the state by clicking on it. 用户可以通过点击它的状态。
Basic Usage基本用法
TheToggle on/off state is represented by a true/false boolean.
Youmust provide the boolean as a parameter to make the Toggle represent the actualstate.
TheToggle function will return a new boolean value if it is clicked.
Inorder to capture this interactivity, you must assign the boolean to accept thereturn value of the Toggle function.
关于切换/关闭状态由一个真/假 布尔。你必须提供一个布尔参数,使切换代表的实际状态。该切换函数将返回一个新的布尔值,如果它被点击。为了抓住这个交互性,你必须指定布尔接受的切换函数的返回值。
/* GUI.Toggle example*/ / * GUI.Toggle例如* /
var toggleBool = true; function OnGUI () { toggleBool = GUI.Toggle (Rect (25, 25, 100, 30), toggleBool, "Toggle"); } Toolbar 工具栏按钮控制本质上是一个排。 Only one of the Buttons on the Toolbar can be active at a time, and it will remain active until a different Button is clicked.只有在工具栏上的按钮,可以将处于活动状态时,它会一直是一个积极的点击不同的按钮。 This behavior emulates the behavior of a typical Toolbar.此行为模拟了一个典型的工具栏的行为。 You can define an arbitrary number of Buttons on the Toolbar.您可以定义一个工具栏上的任意数量的按钮。
BasicUsage 基本用法
Theactive Button in the Toolbar is tracked through an integer.
Youmust provide the integer as an argument in the function.
Tomake the Toolbar interactive, you must assign the integer to the return valueof thefunction.
Thenumber of elements in the content array that you provide will determine thenumber of Buttons that are shown in the Toolbar.
工具栏上的按钮是积极跟踪,通过一个整数。
你必须提供一个函数作为参数的整数。
为了使工具栏的互动,您必须指定整数的函数的返回值。
在数组的内容将决定您提供的是在工具栏显示的按钮数量的元素数。
/* GUI.Toolbar example*/ / * GUI.Toolbar例如* /
var toolbarInt = 0; var toolbarStrings : String[] = ["Toolbar1", "Toolbar2", "Toolbar3"]; function OnGUI () { toolbarInt = GUI.Toolbar (Rect (25, 25, 250, 30), toolbarInt, toolbarStrings); } SelectionGrid 该SelectionGrid控制是一个多行工具栏 。 You can determine the number of columns and rows in the grid. 您可以决定列和行的网格数。 Only one Button can be active at time.只有一个按钮可以处于活动状态的时间。
BasicUsage 基本用法
Theactive Button in the SelectionGrid is tracked through an integer.
Youmust provide the integer as an argument in the function.
Tomake the SelectionGrid interactive, you must assign the integer to the returnvalue of the function.
Thenumber of elements in the content array that you provide will determine thenumber of Buttons that are shown in the SelectionGrid.
Youalso can dictate the number of columns through the function arguments.
在SelectionGrid积极跟踪按钮是通过一个整数。
你必须提供一个函数作为参数的整数。
为了使SelectionGrid互动,您必须指定整数的函数的返回值。
在数组的内容将决定您提供的是在SelectionGrid显示按钮的数目的元素数。
您还可以通过函数参数支配的列数。
/* GUI.SelectionGrid example*/ / * GUI.SelectionGrid例如* /
var selectionGridInt : int = 0; var selectionStrings : String[] = ["Grid 1", "Grid 2", "Grid 3", "Grid 4"]; function OnGUI () { selectionGridInt = GUI.SelectionGrid (Rect (25, 25, 100, 30), selectionGridInt, selectionStrings, 2); } HorizontalSlider 该HorizontalSlider控制是一个典型的横向滑动旋钮,可以改变一个值拖动到预定值之间的最小和最大。
Basic Usage基本用法
Theposition of the Slider knob is stored as a float.滑块的旋钮位置存储为一个浮动。
Todisplay the position of the knob, you provide that float as one of thearguments in the function.要显示该旋钮的位置,您提供的是,由于在函数的参数之一浮动。
Thereare two additional values that determine the minimum and maximum values.有两个确定的最低和最高值增加值。
Ifyou want the slider knob to be adjustable, assign the slider value float to bethe return value of the Slider function.如果你想滑块旋钮可调,分配滑块值是浮动的滑块函数的返回值。
/* Horizontal Slider example */ / * HorizontalSlider 例如* /
var hSliderValue : float = 0.0; function OnGUI () { hSliderValue = GUI.HorizontalSlider (Rect (25, 25, 100, 30), hSliderValue, 0.0, 10.0); } VerticalSlider 该VerticalSlider控制是一个典型的垂直滑动旋钮,可以改变一个值拖动到预定值之间的最小和最大。
Basic Usage基本用法
Theposition of the Slider knob is stored as a float.滑块的旋钮位置存储为一个浮动。
Todisplay the position of the knob, you provide that float as one of thearguments in the function.要显示该旋钮的位置,您提供的是,由于在函数的参数之一浮动。
Thereare two additional values that determine the minimum and maximum values.有两个确定的最低和最高值增加值。
Ifyou want the slider knob to be adjustable, assign the slider value float to bethe return value of the Slider function.如果你想滑块旋钮可调,分配滑块值是浮动的滑块函数的返回值。
/* Vertical Slider example */ /*垂直滑块的例子* /
var vSliderValue : float = 0.0; function OnGUI () { vSliderValue = GUI.VerticalSlider (Rect (25, 25, 100, 30), vSliderValue, 10.0, 0.0); }
HorizontalScrollbar
该HorizontalScrollbar控制是一个滑块控件类似,但视觉元素的处理器类似滚动网络浏览器或Word。 This control is used to navigate theScrollView Control.这种控制是用于导航的滚动视图控制。
Basic Usage基本用法
HorizontalScrollbars are implemented identically to Horizontal Sliders with oneexception: There is an additional argument which controls the width of theScrollbar knob itself.水平滚动条来实现相同的水平滑块有一个例外:有一个额外的参数,它控制旋钮本身的滚动条的宽度。
/* Horizontal Scrollbar example */ / *水平滚动条的例子* / var hScrollbarValue : float; function OnGUI () { hScrollbarValue = GUI.HorizontalScrollbar (Rect (25, 25, 100, 30), hScrollbarValue, 1.0, 0.0, 10.0); } VerticalScrollbar
该VerticalScrollbar控制是一个滑块控件类似,但视觉元素的处理器类似滚动网络浏览器或Word。 This control is used to navigate the ScrollViewControl.这种控制是用于导航的滚动视图控制。
Basic Usage基本用法
VerticalScrollbars are implemented identically to Vertical Sliders with one exception:There is an additional argument which controls the height of the Scrollbar knobitself.垂直滚动条来实现相同的垂直滑块有一个例外:有一个额外的参数的控制旋钮的滚动条本身的高度。
/* Vertical Scrollbar example */ / *垂直滚动条的例子* / var vScrollbarValue : float; function OnGUI () { vScrollbarValue = GUI. VerticalScrollbar (Rect (25, 25, 100, 30), vScrollbarValue, 1.0, 10.0, 0.0); } ScrollViews ScrollViews是控件显示一个控件的可视区域更大设置一个。
Basic Usage基本用法
ScrollViewsrequire two Rects as arguments. ScrollViews需要两个参数Rects作为。 Thefirst Rect defines the location and size of theviewable ScrollView area on the screen.第一个矩形定义大小的屏幕可视面积上滚动视图的位置和。 Thesecond Rect defines the size of the spacecontained inside the viewable area.第二个矩形定义的可视区域的大小的空间内所载。 Ifthe space inside the viewable area is larger than the viewable area, Scrollbarswill appear as appropriate.如果可视区域内的空间比可视区域大,滚动条会显示为适当。 Youmust also assign and provide a 2D Vector which stores the position of theviewable area that is displayed.您还必须指定,并提供二维矢量其中存储的可视区域显示的位置。
/* ScrollView example */ /*滚动视图实例* /
var scrollViewVector : Vector2 = Vector2.zero; var innerText : String = "I am inside the ScrollView"; function OnGUI () { // Begin the ScrollView scrollViewVector = GUI.BeginScrollView (Rect (25, 25, 100, 100), scrollViewVector, Rect (0, 0, 400, 400)); // Put something inside the ScrollView innerText = GUI.TextArea (Rect (0, 0, 400, 400), innerText); // End the ScrollView GUI.EndScrollView(); }
Windows Windows是能够容器控件拖放。 They can receive and lose focus when clicked.他们可以接受和失去焦点时按下。 Because of this, they are implemented slightly differently from the other Controls.正因为如此,他们实施略有不同的其他控制。 Each Window has an id number, and its contents are declared inside a separate function that is called when the Window has focus.每个窗口有一个ID号 ,其内容是集中在一个单独的函数声明时调用该窗口的。
Basic Usage基本用法
Windowsare the only Control that require an additional function to work properly. Windows是唯一的控制,需要一个额外的功能才能正常工作。Youmust provide an id number and a function name to beexecuted for the Window.您必须提供身份证号码和一个函数名被处决的窗口。 Insidethe Window function, you create your actual behaviors or contained Controls.窗口内部功能,您创建您的实际行为或包含的控件。
/* Window example */ /*窗口的例子* /
var windowRect : Rect = Rect (20, 20, 120, 50); function OnGUI () { windowRect = GUI.Window (0, windowRect, WindowFunction, "My Window"); } function WindowFunction (windowID : int) { // Draw any Controls inside the window here }
GUI.changed
为了检测如果用户没有任何等行动(点击一个在GUI按钮,拖动滑块),读出你的脚本GUI.changed价值。 This gets set to true when the user has done something, making it easy to validate the user input.这得到设置为true,当用户做了什么,因此很容易验证用户输入。
Acommon scenario would be for a Toolbar, where you want to change a specificvalue based on which Button in the Toolbar was clicked.一种常见的情况是一个工具栏,在那里你想改变一个特定值的基础上的按钮在工具栏被点击。 Youdon't want to assign the value in every call toOnGUI() , only when one of the Buttons hasbeen clicked.你不希望每次调用指定的值到OnGUI(),只有当一个按钮被按下了。
/* GUI.changed example */ private var selectedToolbar : int = 0; private var toolbarStrings = ["One", "Two"]; function OnGUI () { // Determine which button is active, whether it was clicked this frame or not selectedToolbar = GUI.Toolbar (Rect (50, 10, Screen.width - 100, 30), selectedToolbar, toolbarStrings); // If the user clicked a new Toolbar button this frame, we'll process their input if (GUI.changed) { print ("The toolbar was clicked"); if (selectedToolbar == 0) { print ("First button was clicked"); } else { print ("Second button was clicked"); } } } GUI.changed将返回true,如果任何GUI控制摆在它是用户所操纵。
Unity 3D——GUI基础知识
Unity 3D 2010-06-10 16:51:34 阅读128 评论2 字号:大中小 订阅
播放器的总尺寸: Screen.width
Screen.height
鼠标消失:
Screen.lockCursor = true;
在浏览器打开网址:
Application.OpenURL("http://unity3d.com/");
GUI换字:
GUI.skin = guiSkin;
varicon=icons[Mathf.Round(Time.time*speed)%5];
//返回四舍五入至最接近的整数。0、1、2、3、4、0……
GUI.Button(Rect(10,10,100,100),icon);
系统提示音:
function OnGUI () {
if (Event.current.type ==EventType.mouseDown)
EditorApplication.Beep();
}
场景的新建、打开、添加:(参数为路径)
· EditorApplication.NewScene
Create a new scene
· EditorApplication.OpenScene
Opens the scene at path.
· EditorApplication.OpenSceneAdditive
Opens the scene at path additively.
控件同时有图片和文字:
var icon : Texture2D;
function OnGUI () {
GUI.Box (new Rect(10,10,100,50),new GUIContent("This is text", icon));
}
控件闪烁:
function OnGUI () {
if (Time.time % 2 < 1) {
if (GUI.Button (new Rect(10,10,200,20), "Meet the flashing button")) {
print ("You clicked me!");
}
}
}
//可以利用这个让控件消失
使用GUIContent来显示字符串,图标,工具提示:
/* Using GUIContentto display an image, a string, and a tooltip */
var icon :Texture2D;
function OnGUI () {
GUI.Button (new Rect(10,10,100,20),new GUIContent ("Click me", icon, "This is thetooltip"));
GUI.Label (new Rect(10,40,100,20), gui.tooltip);
}
官方位置:http://unity3d.com/support/documentation/Components/gui-Basics.html
添加网格碰撞
Unity 3D 2010-06-08 11:15:22 阅读52 评论0 字号:大中小 订阅
/*============================================================
* creat by panda 20100421
* ============================================================
*/
@MenuItem ("anda/AddMeshCollider %9")
static function Init ()
{
var selScripts = new Array();
selScripts = Selection.objects; //你所选择的对象集合(GameObject)
for (i = 0; i < selScripts.length; i++) {
varcomponents = new Array();
components =selScripts.GetComponentsInChildren(MeshRenderer); //获取所有含有MeshReader的子对象。
for (j = 0;j < components.length; j++) {
components[j].gameObject.AddComponent("MeshCollider"); //添加触碰
}
}
}
MovieTexture视频贴图(在Unity中简单实现视频播放)
Unity 3D 2010-06-05 15:20:39 阅读61 评论0 字号:大中小 订阅
首先拷贝一个视频文件到Assets文件夹内,确保这个视频的类型是U3D承认的类型。
创建要播放这个视频的物体,比如一个Plane。
为这个物体增加Material材质,并将Movie视频文件给与贴图(有时候你会发现是黑色,那是因为视频没有启动,只要选择视频文件在Preview观看中进行系统播放一下就可以显示出贴图)。
然后创建JavaScript脚本。
functionStart ()
{
renderer.material.mainTexture.Play();
}
内容如上。
这个也可以在官方帮助中选择Scripting中搜索Play然后选择MovieTexture.Play找到。
将这个脚本给与播放视频的物体即可。
在图中可以打开Loop进行视频循环播放,你开始运行程序即可看到视频在播放。
经过实验表明大部分经过其它软件压缩的视频都可以使用,并且U3D还能自行调整视频质量。
摘自:http://bbs.vrsh.cn/thread-3162-1-2.html
Unity3D开发者常见问题20条
Unity 3D 2010-06-05 10:32:45 阅读57 评论2 字号:大中小 订阅
1:天空盒有接缝怎么解决?
答:在贴图导入设置里设置Wrap Mode为"Clamp".
2:DDS格式怎么不显示?
答:Unity不支持DDS格式,Unity会将除DDS外的其他格式图片具有为DDS同样的优化.
3:Unity如何动态载入外部模型等文件?
答:可以使用AssetBundle:http://unity3d.com/support/documentation/ScriptReference/AssetBundle.html
4:脚本编辑器有语法提示吗?
答:有的,Win版使用Ctrl+I,Mac版使用Ctrl+>.
5:如何使用烘焙贴图(多重纹理)?
答:不要使用Shell贴图,直接将烘焙图赋予贴图的"自发光"通道之上.
6:怎么屏蔽Webplayer右键菜单?
答:<paramname="disableContextMenu" value="true" />
7:为什么水面没有实时反射效果?
答:只有专业版才支持这种反射效果.
8:怎么做摄像机漫游动画?
答:Max正常制作摄像机漫游动画,倒到Unity中后,将Unity的Camea拖拽到Max导出的摄像机Gameobject物体之上,作为其子物体即可.
9:如何自定义Webplayer载入Logo及进度条?
答:<param name="logoimage"value="Logo文件名" />,<paramname="progressbarimage" value="进度条名" />,<param name="progressframeimage" value="进度条外框名" />.
10:GUI上怎么使用中文字?
答:导入任意中文字体,然后定义GUISkin字体为该字体即可.
11:购买一个授权可以安装几台电脑?
答:可以安装于2个系统之上比如一个Win版一个Mac版.
12:Max文件扔到Unity中怎么说导入失败?
答:下载最新版Fbx插件,用Max导出Fbx文件然后扔Unity中.
13:如何不让摄像头穿透模型,离模型近了就像模型露面了?
答:设置相机的Near clipplane,调小一点,但是不要给负数.
14:怎么用双面贴图?
答:Unity中可设置双面Shader,最简单有效的办法是直接做成双面的实体模型.
15:导入的Fbx模型尺寸小于Max中的尺寸?
答:在Unity中该文件的导入设置中设置缩放因子为1.
16:如何给相机添加Glow效果?
答:选中相机对象,在菜单中选中Component-Image Effects-Glow赋予该组件即可(专业版才支持此特效)
17:怎么设置Webplayer默认尺寸?
答:到菜单Edit-ProjectSettings-Player中设置Default Web Screen尺寸即可.
18:怎么设置可执行文件的启动Banner?
答:到菜单Edit-ProjectSettings-Player中设置Resolution Dialog Banner.
19:如何设置雾效?
答:到菜单Edit-RenderSettings中开启Fog及设置Fog Color等即可.
20:如何设定默认Skybox天空盒?
答:到菜单Edit-RenderSettings中设置Skybox Material即可.
引用:http://www.to3d.com/3dtech/show-1854-1.html
Unity教学视频网址(buzz大叔)
Unity 3D 2010-06-05 10:30:14 阅读59 评论0 字号:大中小 订阅
http://www.3dbuzz.com/vbforum/sv_videonav.php?fid=808bf515c69066eb13df7952c0d54711
[Unity3D]深度相机 Depth Camera(在屏幕中做小屏幕用)
Unity 3D 2010-06-05 10:27:00 阅读95 评论0 字号:大中小 订阅
作为3D世界里最重要的窗口,摄像机的应用就显得很重要,毕竟在屏幕上看到的一切都得用摄像机矩阵变换得来的嘛。
论坛上看到了一篇帖子讲非天空盒的背景做法,让我想起其实很多界面合成画面可以用摄像机之间的交互来实现(避开用GUI,效率问题我没尝试过,但是貌似用深度相机比gui好?以后试验下)。
首先说下深度相机,就是用2个或者2个以上的相机,设置好参数后自动到屏幕视觉合成的效果,应用上两个方面:1,背景图 2,用户界面。
步骤:
1.建立第二个相机,设置 Clear Flags 属性为 Depth Only (深度模式)
把摄像机和摄像机面前要投影的东西放到场景以外开不到的地方。
2.设置Depth属性
主摄像机默认是-1 ,如果你的物体要显示在他层面之上,就设比他大的数,不然就设比他小的数
3.设置贴图的Aniso Level属性到最高(9)
这样贴图就能清晰些。
4.最后去处摄像机自带的没用的组件
去除掉Audio Listener之类的东西。
放前面当界面用,放背后可以当背景,做些什么远处的树啊山啊之类的不错。
这样的话,车仪表盘指针就可以编程让他动了。 ^ ^
摘自:http://user.qzone.qq.com/175707544/blog/1250656726
Unity3D使用C#实现Coroutines & Yield(转)
Unity 3D 2010-06-05 10:24:28 阅读38 评论0 字号:大中小 订阅
Coroutines& Yield是Unity3D编程中重要的概念,它可以实现将一段程序延迟执行或者将其各个部分分布在一个时间段内连续执行,但是在Javascript与C#中实现Coroutines& Yield,在语法上却有一些区别:
yield不可单独使用
需要与return配合使用,例如:
1 yieldreturn 0; //等0帧
2 yieldreturn 1; //等1帧
3 yieldreturn WaitForSeconds(3.0); //等待3秒
所有使用yield的函数必须将返回值类型设置为IEnumerator类型,例如:
1IEnumerator DoSomeThingInDelay() {...}
最后,也是在”Using C#”这个章节中没有讲到的关键一点是,所有IEnumerator类型函数必须使用”StartCoroutine”这个函数触发,不能单独使用,例如:
1StartCoroutine(DoSomeThingInDelay());
最后附上学习Coroutines & Yield时所做的小例子,脚本的作用是不断随机改变材质的颜色,演示demo使用”V字仇杀队”中的面具。
using UnityEngine;
using System.Collections;
public class RandomColor : MonoBehaviour {
public float delayInSecond = 1;
public Material targetMaterial;
// Use this for initialization
void Start () {
StartCoroutine(AutoChangeColor());
}
// Update is called once per frame
void Update () {
}
IEnumerator AutoChangeColor()
{
yield return 0; //确保Time.deltaTime为0
Color colorNew = GenerateRandomColor();
Color colorNow =targetMaterial.GetColor(&quot;_Color&quot;);
float timeEclapsed = 0;
for (timeEclapsed = 0; timeEclapsed &lt; delayInSecond;timeEclapsed += Time.deltaTime)
{
float progress = timeEclapsed / delayInSecond;
Color colorTween = new Color(
(colorNew.r - colorNow.r) * progress + colorNow.r,
(colorNew.g - colorNow.g) * progress + colorNow.g,
(colorNew.b - colorNow.b) * progress + colorNow.b
);
targetMaterial.SetColor(&quot;_Color&quot;, colorTween);
yield return 1;
}
StartCoroutine(AutoChangeColor());
}
Color GenerateRandomColor(){
Color color = new Color();
color.r = Random.value;
color.g = Random.value;
color.b = Random.value;
return color;
}
}
摘自:http://www.unity3d8.com/content/unity3d%E4%BD%BF%E7%94%A8c%E5%AE%9E%E7%8E%B0coroutines-yield%E8%BD%AC