【Unity3D游戏开发】之常用代码 (十二)

  1 //创建一个名为"Player"的游戏物体
  2 //并给他添加刚体和立方体碰撞器.
  3 player=new GameObject("Player");
  4 player.AddComponent("Rigidbody");
  5 player.AddComponent("BoxCollider");
  6 
  7 //创建一个没有名称的游戏物体
  8 //并给他添加刚体和立方体碰撞器.Transform总是被添加到该游戏物体.
  9 player=new GameObject();
 10 player.AddComponent("Rigidbody");
 11 player.AddComponent("BoxCollider");
 12 //添加名为FoobarScript的脚本到游戏物体
 13 gameObject.AddComponent("FoobarScript");
 14 //添加球形碰撞器到游戏物体
 15 gameObject.AddComponent("FoobarCollider");
 16 注意,没有RemoveComponent(),来移除组件,使用Object.Destroy.
 17 
 18 
 19 
 20 //不激活该游戏物体.
 21 gameObject.active=false;
 22 
 23 
 24 //附加到这个游戏物体的动画组件(只读)(如果没有为null)
 25 var other: GameObject;
 26 other.animation.Play();
 27 
 28 //附加到这个游戏物体的声音组件(只读)(如果没有为null)
 29 var other: GameObject;
 30 other.audio.Play();
 31 
 32 
 33 //附加到这个游戏物体的相机(只读)(如果没有为null)
 34 var other: GameObject;
 35 other.camera.fieldOfView=45;
 36 
 37 //附加到这个游戏物体的碰撞器(只读)(如果没有为null)
 38 var other: GameObject;
 39 other.collider.material.dynamicFriction=1;
 40 
 41 
 42 //附加到这个游戏物体的恒定力(只读)(如果没有为null)
 43 var other: GameObject;
 44 other.constantForce.relativeForce=Vector3(0,0,1);
 45 
 46 //附加到这个游戏物体的GUIText,GUITexture(只读)(如果没有为null)
 47 var other: GameObject;
 48 other.guiText.text="HelloWorld";
 49 
 50 
 51 //附加到这个游戏物体的HingeJoint(只读)(如果没有为null)
 52 var other: GameObject;
 53 other.hingeJoint Spring.targetPosition=70;
 54 
 55 //游戏物体所在的层,一个层在[0...32]之间.
 56 Layer可以用来选择性的渲染或忽略投射.
 57 //设置游戏物体到忽略投射物体的层上
 58 gameObject.layer=2;
 59 
 60 
 61 //附加到这个游戏物体的光影(只读)(如果没有为null)
 62 var other: GameObject;
 63 other.light.range=10;
 64 
 65 //附加到这个游戏物体的网络视(只读)(如果没有为null)
 66 var other: GameObject;
 67 other.networkView.RPC("MyFunction",RPCMode.All,"someValue");
 68 
 69 
 70 //附加到这个游戏物体的粒子发射器(只读)(如果没有为null)
 71 var other: GameObject;
 72 other.particleEmitter.emite=true;
 73 
 74 //附加到这个游戏物体的渲染器(只读)(如果没有为null)
 75 var other: GameObject;
 76 other.renderer.material.color=Color.green;
 77 
 78 
 79 //附加到这个游戏物体的刚体(只读)(如果没有为null)
 80 var other: GameObject;
 81 other.rigidbody.AddForce(1,1,1);
 82 
 83 //标签可以用来标识一个游戏物体。标签在使用前必须在标签管理器中定义。
 84 gameObject.tag="Player";
 85 
 86 
 87 //附加到这物体的变换. (如果没有为null)
 88 var other: GameObject;
 89 other.transform.Translate(1,1,1);
 90 
 91 
 92 
 93 //在这个游戏物体或其任何子上的每个MonoBehaviour上调用methodName方法。
 94 //通过使用零参数,接收方法可以选择忽略parameter。如果options被设置为
 95 SendMessageOptions.RequireReceiver,那么如果这个消息没有被任何组件接收时将打印一个
 96 错误消息。
 97 ///使用值5调用函数ApplyDamage
 98 gameObject.BroadcastMessage("ApplyDamage",5);
 99 //所有附加到该游戏物体和其子物体上脚本中的
100 //ApplyDamage函数都将调用
101 function ApplyDamage(damage)
102 
103 {
104      print(damage)
105 }
106 
107  
108 
109  
110 
111 //立即死亡触发器
112 //销毁任何进入到触发器的碰撞器,这些碰撞器被标记为Player.
113 function OnTriggerEnter(other: Collider)
114 {
115     if(other.gameObject.CompareTag("Player"))
116     {
117          Destroy(other.gameObject);
118      }
119 }
120 
121  
122 
123 
124 如果游戏物体有type类型的组件就返回它,否则返回null. 你可以使用这个函数
125 访问内置的组件或脚本.
126 GetComponent是防卫其他组件的主要方法。对于Javascript脚本的类型总是脚本显示
127 在工程视图中的名称。例如:
128 function Start()
129 {
130      var curTransform: Transform;
131      curTransform=gameObject.GetComponent(Transform);
132      //这等同于
133      curTransform=gameObject.transform;
134 }
135 function Update()
136 
137 {
138      //为访问附加在同一游戏物体上
139      //其他脚本内的公用变量和函数
140      //(ScriptName为Javascript文件名)
141      var other: ScriptName=gameObject.GetComponent(ScriptName);
142      //调用该脚本中的DoSomething函数
143      other DoSomething();
144      //设置其他脚本实例中的另一个变量
145      other.someVariable=5;
146 }
147 
148  
149 
150 //返回type类型的组件,这个组件位于这个游戏物体或任何它的子物体上,使用深度优先搜索。
151 //只有激活的组件被返回。
152 var script: ScriptName=gameObject.GetComponentInChildren(ScriptName);
153 script.DoSomething();    
154 
155  
156 
157  
158 
159 //返回该游戏物体上所有type类型的组件。
160 //在这个游戏物体和所有它的子物体上
161 //的HingeJoints上禁用弹簧
162 var hingeJoints=gameObject.GetComponents(HingeJoint);
163 for(var joint: HingeJoint in hingeJoints)
164 
165 {
166      joint.useSpring=false;
167 }
168 
169 
170 
171 //返回所有type类型的组件,这些组件位于该游戏物体或任何它的子物体上。
172 //只有激活的组件被返回。
173 //在这个游戏物体和所有它的子物体上
174 //的所有HingeJoints上禁用弹簧
175 var hingeJoints=gameObject.GetComponentsInChildren(HingeJoint);
176 for(var joint: HingeJoint in hingeJoints)
177 
178 {
179      joint.useSpring=false;
180 }
181 
182  
183 
184 //在一个特定的时间采样动画,用于任何动画目的。
185 //出于性能考虑建议使用Animation接口,这将在给定的time采用animation,任何被动化的组件属性都将被这个采样值替换,多数时候你会使用Animation.Play. SampleAnimation
186 //用于当你需要以无序方式或给予一些特殊的输入在帧之间跳跃时使用。参见:Aniamtion
187 //通过采样每一帧或动画剪辑
188 var clip.AniamtionClip
189 function Update()
190 {
191     gameObject.sampleAnimation(clip, clip.length-Time.time);
192 }
193 
194 
195 //设置这个物体和所以子游戏物体的机会状态。
196 gameObject.SetActiveRecursion(true);
197 
198   
199 
200 //用几何的网格渲染器和适当的碰撞器创建一个游戏物体。
201 ///在场景中创建一个平面,球体和立方体
202 function Start()
203 {
204      var plane:GameObject= GameObject.CreatePrimitive(PrimitiveType.Plane);
205 
206      var cube=GameObject.CreatePrimitive(PrimitiveType.Cube);
207      cube.transform.position=Vector3(0,0.5,0);
208 
209       var sphere=GameObject.CreatePrimitive(PrimitiveType.Sphere);
210      sphere.transform.position=Vector3(0,1.5,0);
211 
212      var capsule=GameObject.CreatePrimitive(PrimitiveType.Capsule);
213      capsule.transform.position=Vector3(2,1,0);
214 
215       var cylinder=GameObject.CreatePrimitive(PrimitiveType.Cylinder);
216      cylinder.transform.position=Vector3(-2,1,0);
217 }
218 
219   
220 
221 static function Find(name: string): GameObject
222 
223 描述:依据name查找物体并返回它.
224 如果没有物体具有名称name返回null. 如果name包含'/'字符它将像一个路径名一样穿
225 越层次,这个函数只返回激活的游戏物体。
226 出于性能考虑建议不要在每帧中都是有该函数,而是在开始时调用并在成员变量中缓存结果
227 或者用GameObject.FindWithTag.
228 //这返回场景中名为Hand的游戏物体.
229 hand=GameObject.Find("Hand");
230 //这将返回名为Hand的游戏物体.
231 //在层次试图中Hand也许没有父!
232 hand=GameObject.Find("/Hand");
233 //这将返回名为Hand的游戏物体.
234 //它是Arm>Monster的子.
235 //在层次试图中Monster也许没有父!
236 hand=GameObject.Find("/Monster/Arm/Hand");
237 //这将返回名为Hand的游戏物体.
238 //它是Arm>Monster的子.
239 //Monster有父.
240 hand=GameObject.Find("/Monster/Arm/Hand");
241 这个函数最常用与在加载时自动链接引用到其他物体,例如,在MonoBehaviour.Awake
242 或MonoBehaviour.Start内部. 处于性能考虑你不应该在每帧中调用这个函数,例如
243 MonoBehaviour.Update内. 一个通用的模式是在MonoBehaviour.Start内将一个游戏物体赋给
244 一个变量. 并在MonoBehaviour.Update中使用这个变量.
245 //在Start中找到Hand并在每帧中选择它
246 private var hand: GameObject;
247 function Start()
248  
249 {
250      hand=GameObject.Find("/Monster/Arm/Hand");
251 }
252 function Update()
253 {
254      hand.transform.Rotate(0,100*Time.deltaTime,0);
255 }
256 
257  
258 
259 function FindGameObjectsWithTag(tag: string): GameObject[]
260 
261 描述:返回标记为tag的激活物体列表,如果没有发现返回null.
262 标签在使用前必须在标签管理中定义。
263 //在所有标记为"Respawn"的物体位置处
264 //实例化respawnPrefab
265  
266 var respawnPrefab: GameObject;
267 var respawns=GameObject.FindGameObjectsWithTag("Respawn");
268 for(var respawn in respawns)
269 Instantiate(respawnPrefab, respawn.position, respawn.rotation);
270 //打印最接近的敌人的名称
271 print(FindClosestEnemy().name);
272 //找到最近的敌人的名称
273 function FindClosestEnemy(): GameObject
274 {
275      //找到所以标记为Enemy的游戏物体
276      var gos: GameObject[]
277      gos=GameObject.FindGameObjectsWithTag("Enemy");
278      var closest: GameObject;
279      var distance=Mathf.Infinity;
280      var position=transform.position;
281      //遍历它们找到最近的一个
282      for(var go: GameObject in gos)
283      {
284            var diff=(go.transform.position-position);
285            var curDistance=diff.sqrMagnitude;
286            if(curDistance<distance)
287 
288  
289 
290            {
291                closest=go;
292                distance=curDistance;
293             }
294        }
295       return closest;
296 }
297 
298  
299 
300 返回标记为tag的一个激活游戏物体,如果没有发现返回null.
301 标签在使用前必须在标签管理中定义。
302 //在标记为"Respawn"的物体位置处
303 //实例化一个respawnPrefab
304 var respawnPrefab: GameObject;
305 var respawns=GameObject.FindWithTag("Respawn");
306 Instantiate(respawnPrefab, respawn.position, respawn.rotation);
307  
308 
309 主材质的纹理缩放。
310 这与使用带有"_MainTex"名称的GetTextureScale或SetTextureScale相同。
311 function Update()
312 
313 {
314      var scalex=Mathf.Cus(Timetime)*0.5+1;
315      var scaleY=Mathf.Sin(Timetime)*0.5+1;
316      renderer.material.mainTextureScale=Vector2(scaleX,scaleY);
317 }
318 
319 参见:SetTextureScale.GetTextureScale.
320 
321  
322 
323 在这个材质中有多少个pass(只读).
324 这个最常用在使用GL类之间绘制的代码中(只限于Unity Pro). 例如,Image Effects使用
325 材质来实现屏幕后期处理. 对材质中的每一个pass(参考SetPass)它们激活并绘制一个全屏
326 四边形。
327 这里是一个全屏图形效果的例子,它反转颜色。添加这个脚本到相机并在播放模式中
328 查看。
329 private var mat: Material;
330 function Start()
331 {
332 mat=new Material(
333 "Shader"Hidden/Invert"{"+
334 "SubShader{"+
335 "Pass{"+
336 "ZTestAlways Cull Off ZWrite Off"+
337 "SetTexture[_RenderTex]{combine one-texture}"+
338 "}"+
339 "{"+
340 "}"+
341 );
342 }
343 function OnRenderImage(source: RenderTexture, dest: RenderTexture){
344 RenderTexture.active=dest;
345 source.SetGlobalShaderProperty("_RenderTex");
346 GL.PushMatrix();
347 GL.LoadOrtho();
348 //对于材质中的每个pass(这里只有一个)
349 for(var i=0; i<mat.passCount; ++i){
350 //激活pass
351 mat.SetPass(i);
352 //绘制一个四边形
353 GL.Begin(GLQUADS);
354 GL.TEXCoord2(0,0); GL.Vertex3(0,0,0.1);
355 GL.TEXCoord2(1,0); GL.Vertex3(1,0,0.1);
356 GL.TEXCoord2(1,1); GL.Vertex3(1,1,0.1);
357 GL.TEXCoord2(0,1); GL.Vertex3(0,1,0.1);
358 GL.End();
359 }
360 GL.PopMatrix();
361 }
362 
363 参见:SetPass函数,GL类,ShaderLab documentation.
364 
365  
366 
367  
368 
369 该材质使用的着色器。
370 //按下空格键时,
371 //在Diffuse和Transparent/Diffuse着色器之间切换
372 private var shader1=Shader.Find("Diffuse");
373 private var shader2=Shader.Find("Transparent/Diffuse");
374 function Update()
375 
376 {
377       if(Input.GetButtonDown("Jump"))
378 
379       {
380            if(renderer.material.shader--shader1)
381                rendere.material.shader=shader2;
382            else
383                renderer.material.shader=shader1;
384        }
385 }
386 
387 参见:Shader.Find方法,Material, ShaderLab documentation.
388 
389  
390 
391  
392 
393 从一个源shader字符串创建一个材质。
394 如果你有一个实现自定义特效的脚本,你需要使用着色器和材质实现所有的图像设置。
395 在你的脚本内使用这个函数创建一个自定义的着色器和材质。在创建材质后,使用SetColor,
396 SetTexture, SetFloat, SetVector, SetMatrix来设置着色器属性值。
397 //创建一个附加混合材质并用它来渲染
398 var color=Color.white;
399 function Start()
400 {
401 var shader Text=
402 "shader"Alpha Additive"{"+
403 Properties{_Color("Main Color", Color)=(1,1,1,0)}"+
404 "SubShader {"+
405 "Tags {"Queue"="Transparent"}"+
406 "Pass {"+
407 "Blend One One ZWrite Off ColorMask RGB"+
408 "Material {Diffuse[_Color]Ambient[_Color]}"+
409 "Lighting On"+
410 "SetTexture[_Dummy]{combine primary double, primary}"+
411 "}"+
412 "}"+
413 "}";
414 renderer.material=new Material(shaderText);
415 renderer.material.color=color;
416 }
417 
418  
419 
420 获取一个命名的颜色值。
421 数多shader使用超过一个颜色,使用GetColor来获取propertyName颜色。
422 Unity内置着色器使用的普通颜色名称;
423 "_Color"为材质的主颜色。这也能够通过color属性访问。
424 "_SpecColor"为材质的反射颜色(在specular/glossy/vertexlit着色器中使用)。
425 "_Emission"为材质的散射颜色(用在reflective着色器中使用)。
426 print(renderder.material.GetColor("_SpecColor));
427 
428  
429 
430  
431 
432 获取一个命名纹理。
433 数多shader使用超过一个纹理。使用GetTexture来获取propertyName纹理。
434 Unity内置着色器使用的普通纹理名称;
435 "_MainTex"为主散射纹理. 这也能够通过mainTexture属性访问。
436 "_BumpMap"为法线贴图。
437 "_LightMap"为光照贴图。
438  
439 "_Cube"为发射立方体贴图。
440 function Start()
441 
442 {
443    var tex=renderer.material.GetTexture("_BumpMap");
444    if(tex)
445         print("My bumpmap is "+ tex.name);
446    else
447         print("I have no bumpmap!");
448 }
449 
450 function GetTextureOffset(propertyName: string): Vector2
451 
452 function GetTextureScale(propertyName: string): Vector2
453 
454  
455 
456 Mathf.Lerp 插值
457 当t = 0返回from,当t = 1 返回to。当t = 0.5 返回from和to的平均值。
458 // 在一秒内从minimum渐变到maximum
459 
460 var minimum = 10.0;
461 var maximum = 20.0;
462 
463 function Update () {
464     transform.position = Vector3(Mathf.Lerp(minimum, maximum, Time.time), 0, 0);
465 }
466 
467 //像弹簧一样跟随目标物体
468 var target : Transform;
469 var smooth = 5.0;
470 function Update () {
471     transform.position = Vector3.Lerp (
472     transform.position, target.position,
473     Time.deltaTime * smooth);
474 }
475 
476 //混合两个材质
477 var material1: Material;
478 var material2: Material;
479 var duration=2.0;
480 function Start()
481 {
482     //首先使用第一个材质
483     renderer.material=material[];
484 }
485 function Update()
486 {
487     //随着时间来回变化材质
488     var lerp=Mathf.PingPong(Time.time, duration)/duration;
489     renderer.material.Lerp(material1, materail2, lerp);
490 }
491 
492 
493 设置一个命名的颜色值。
494 数多shader使用超过一个颜色。使用SetColor来获取propertyName颜色.
495 Unity内置着色器使用的普通颜色名称;
496 "_Color"为材质的主颜色. 这也能够通过color属性访问.
497 "_SpecColor"为材质的反射颜色(在specular/glossy/vertexlit着色器中使用).
498 "_Emission"为材质的散射颜色(用在vertexlit着色器中).
499 "_ReflectColor"为材质的反射颜色(用在reflective着色器中).
500 function Start()
501 
502 {
503     //设置Glossy着色器这样可以使用反射颜色
504     renderer.material.shader=Shader.Find("Glossy");
505     //设置红色的高光
506     renderer.material.SetColor("_SpecColor", Color.red);
507 }
508 
509  
510 
511  
512 
513 SetFloat(propertyName: string, value: float): void
514 
515  
516 
517 
518 描述:设置一个命名的浮点值。
519 function Start()
520 
521  
522 
523 {
524      //在这个材质上使用Glossy着色器
525      renderer.material.shader=Shader.Find("Glossy");
526 }
527 function Update()
528 
529  
530 
531 {
532      //动画Shininess值
533      var shininess=Mathf.PingPong(Time.time, 1.0);
534      renderer.material.SetFloat("_Shininess, shininess);
535 }
536 
537  
538 
539 Mathf.PingPong 乒乓
540 function Update () {
541     // Set the x position to loop between 0 and 3
542     //设置x位置循环在0和3之间
543     transform.position = Vector3(
544     Mathf.PingPong(Time.time, 3), transform.position.y, transform.position.z);
545 } 
546 
547 
548 
549 //如果当前变换z轴接近目标小于5度的时候,打印"close"
550 var target : Transform;
551 function Update () {
552     var targetDir = target.position - transform.position;
553     var forward = transform.forward;
554     var angle = Vector3.Angle(targetDir, forward);
555     if (angle < 5.0)
556         print("close");
557 }
558 
559 
560 
561 Vector3.ClampMagnitude 限制长度
562 返回向量的长度,最大不超过maxLength所指示的长度。
563 
564 也就是说,钳制向量长度到一个特定的长度。
565 
566 var abc : Vector3;
567 
568 function Start ()
569 {
570     abc=Vector3(0,10,0);
571     abc=Vector3.ClampMagnitude(abc, 2);
572     //abc返回的是Vector3(0,2,0)
573     abc=Vector3.ClampMagnitude(abc, 12);
574     //abc返回的是Vector3(0,10,0)
575  }
576 
577 Vector3.Dot 点乘
578 对于normalized向量,如果他们指向在完全相同的方向,Dot返回1。如果他们指向完全相反的方向,返回-1。对于其他的情况返回一个数(例如:如果是垂直的Dot返回0)。对于任意长度的向量,Dot返回值是相同的:当向量之间的角度减小,它们得到更大的值。
579 // detects if other transform is behind this object
580 //检测其他变换是否在这个物体的后面
581 
582 var other : Transform;
583 function Update() {
584     if (other) {
585         var forward = transform.TransformDirection(Vector3.forward);
586         var toOther = other.position - transform.position;
587         if (Vector3.Dot(forward,toOther) < 0)
588             print ("The other transform is behind me!");
589     }
590 }
591 
592 Vector3.forward 向前
593 写Vector3(0, 0, 1)的简码,也就是向z轴。
594 transform.position += Vector3.forward * Time.deltaTime;
595 
596 
597 Vector3.magnitude 长度
598 向量的长度是(x*x+y*y+z*z)的平方根。
599 
600 Vector3.Max 最大
601 返回一个由两个向量的最大组件组成的向量
602 var a : Vector3 = Vector3(1, 2, 3);
603 var b : Vector3 = Vector3(4, 3, 2);
604 print (Vector3.Max(a,b)); 
605 // prints (4.0,3.0,3.0)
606 
607 
608 Vector3.one
609 Vector3(1, 1, 1)的简码。
610 transform.position = Vector3.one;
611 
612 
613 Vector3.operator * 运算符
614 // make the vector twice longer: prints (2.0,4.0,6.0)
615 //使该向量变长2倍
616 print (Vector3(1,2,3) * 2.0);
617 
618 
619 Vector3.operator +
620 // prints (5.0,7.0,9.0)
621 print (Vector3(1,2,3) + Vector3(4,5,6));
622 
623 
624 static function Project (vector : Vector3, onNormal : Vector3) : Vector3
625 投射一个向量到另一个。
626 返回一个向量,这个向量由vector投射到onNormal。 返回0如果onNormal几乎等于或等于0;
627 即vector垂直投射到onNormal与原点连线的线上的点
628 
629 Transform就是U3D所封装的矩阵运算,所实现的功能不过就是物体矩阵的运算罢了
630 
631 
632  
633 
634 SimplePath 提供任何类型的高级寻路功能。
635 
636 包含寻路、转向、路径平滑、动态障碍物避免、地形编辑。
637 用户手册查看地址:http://www.alexkring.com/SimplePath/SimplePath.pdf
638 API:http://www.alexkring.com/SimplePath/Doxygen/html/index.html
639 Demo Video:http://www.youtube.com/watch?v=sTb59eKp6qM
640 500 Agents Pathfinding + Dynamic Obstacle Avoidance:http://youtu.be/8ZNaNdOFXRw
641 
642 //加载test下所有资源
643 function Start () 
644 {
645 //需将textres转为Texture2D[]
646 var textures:Object[] = Resources.LoadAll("_texture/test");
647 Debug.Log("textures.Length: " + textures.Length);
648 }
649 
650  
651 
652 //基于时间滚动主纹理
653 var scrollSpeed=0.5;
654 function Update()
655 
656 {
657      var offset=Time.time*scrollspeed;
658      renderer.material.mainTextureOffset=Vector2(offset,0);
659 }
660 
661 参见:SetTextureOffset.GetTextureOffset.

 

posted @ 2016-03-25 08:51  MATU  阅读(4176)  评论(0编辑  收藏  举报