关于一个Unity的问题,AddComponent<>和GetComponent<>有啥区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于一个Unity的问题,AddComponent<>和GetComponent<>有啥区别?相关的知识,希望对你有一定的参考价值。
我感觉好像都一样,请大神们指点指点
您好,简单说明一下,Awake在MonoBehavior创建后就立刻调用,Start将在MonoBehavior创建后在该帧Update之前,在该Monobehavior.enabled == true的情况下执行。void Awake ()
//初始化函数,在游戏开始时系统自动调用。一般用来创建变量之类的东西。
void Start()
//初始化函数,在所有Awake函数运行完之后(一般是这样,但不一定),在所有Update函数前系统自动条用。一般用来给变量赋值。
我们通常书写的脚本,并不会定义[ExecuteInEditMode]这个Attribute,所以Awake和Start都只有在Runtime中才会执行。
例1:
public class Test : MonoBehaviour
void Awake ()
Debug.Log("Awake");
enabled = false;
void Start ()
Debug.Log("Start");
以上代码,在Awake中我们调用了enabled = false; 禁止了这个MonoBehavior的update。由于Start, Update, PostUpdate等属于runtime行为的一部分,这段代码将使Start不会被调用到。
在游戏过程中,若有另外一组代码有如下调用:
Test test = go.GetComponent<Test>();
test.enabled = true;
这个时候,若该MonoBehavior之前并没有触发过Start函数,将会在这段代码执行后触发。
例2:
player.cs
private Transform handAnchor = null;
void Awake () handAnchor = transform.Find("hand_anchor");
// void Start () handAnchor = transform.Find("hand_anchor");
void GetWeapon ( GameObject go )
if ( handAnchor == null )
Debug.LogError("handAnchor is null");
return;
go.transform.parent = handAnchor;
other.cs
...
GameObject go = new GameObject("player");
player pl = go.AddComponent<player>(); // Awake invoke right after this!
pl.GetWeapon(weaponGO);
...
以上代码中,我们在player Awake的时候去为handAnchor赋值。如果我们将这步操作放在Start里,那么在other.cs中,当执行GetWeapon的时候就会出现handAnchor是null reference.
总结:我们尽量将其他Object的reference设置等事情放在Awake处理。然后将这些reference的Object的赋值设置放在Start()中来完成。
当MonoBehavior有定义[ExecuteInEditMode]时
当我们为MonoBehavior定义了[ExecuteInEditMode]后,我们还需要关心Awake和Start在编辑器中的执行状况。
当该MonoBehavior在编辑器中被赋于给GameObject的时候,Awake, Start 将被执行。
当Play按钮被按下游戏开始以后,Awake, Start 将被执行。
当Play按钮停止后,Awake, Start将再次被执行。
当在编辑器中打开包含有该MonoBehavior的场景的时候,Awake, Start将被执行。
值得注意的是,不要用这种方式来设定一些临时变量的存储(private, protected)。因为一旦我们触发Unity3D的代码编译,这些变量所存储的内容将被清为默认值。 参考技术A 这么多年前的,突然想回答。 大概就是Add是给你碗里加饭,Get是查找你碗里的饭。哈哈哈不一定非要Add才能Get,因为可能本来就有饭。 参考技术B 一个添加组件,一个获取组件,不一样啊,你只有add后,才能get
(转) 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.