unity各种脚本模块

f_DeltaTime值。 //自己计算每一帧时间

1

2

3

4

5

6

7

8

9

10

11

12

float f_LastFrameRealtime;

 

void Start()

{

f_LastFrameRealtime = Time.realtimeSinceStartup ;

}

 

void Update()

{

float f_DeltaTime = Time.realtimeSinceStartup - f_LastFrameRealtime;

f_LastFrameRealtime = Time.realtimeSinceStartup ;

}

 


(2) mecanim系统中 muscle可以控制角色各部位摆动幅度等, 速度为负,动画倒着播放

1

2

3

4

5

6

7

8

9

10

11

Vector3 wantedDir = (target.position- anim.rootPosition).normalized; //想要到达的面向

Vector3 currentDir = anim.rootRotation * Vector3.forward;//当前面向

if(Vector3.Dot(currentDir, wantedDir) > 0){//dot cos值>0既在currentDir的前半圆

anim.SetFloat("Direction", Vector3.Cross(currentDir, wantedDir).y, .25f, Time.deltaTime); 这里在currentDir右边既为正.

//cross叉乘 ,叉乘向量的y值既,在xz面中,wantedDir在currentdir 的哪个位置,1到-1之间,左手坐标系,四指指向原向量,四指弯曲指向目标向量,大拇指所指方向既为正

}else{

anim.SetFloat("Direction",Vector3.Cross(currentDir,wantedDir).y > 0 ? 1 : -1, .25f, Time.deltaTime);

}

 

col.Move(anim.deltaPosition);//animator动画的帧位置

transform.rotation = anim.rootRotation;//根旋转量<br><br>

animator anystate 优先级最高,只要设定了变量,为真,马上执行
setikposition 可以调制角色不同部位的单独控制,分建不同的层

//修改摄像机的cullingMask

1

2

3

4

5

6

7

int oldMask = camera.cullingMask;

// change mask

camera.cullingMask = (1 << LayerMask.NameToLayer("TransparentFX")) | (1 << LayerMask.NameToLayer("OtherLayer"));

// do something

// ...

// restore mask

camera.cullingMask = oldMask;

  

Profiler 探查窗口 可以查看cpu使用率等 
RenderTexture 摄像机 制作舞台效果

组件右上角,copy component 可以粘贴属性,或复制。

meshrenderer不激活,则物体不显示,但仍然存在,可以碰到

在编辑器选中需要添加碰撞的UITexture对象,给该对象必须要先赋予Texture,直接操作“Alt+Shift+C”,
NGUI会给你计算出一个适合于当前对象的BoxCoillder。如果说该对象已经有一个BoxCoillder,那NGUI会调整它的大小以适应UITexture的大小。
剩下的就是按照自己的需要调整顺序关系。 
右键向深度高的,左键向深度低的

start里面使用协同,可以不用update而按时间执行比如

1

2

3

4

5

6

7

8

9

void Start(){

StartCoroutine(GoToSleep());

}

IEnumerator GoToSleep(){

yield return new WaitForSeconds(startCheckInSeconds);

 

while( sth){

yield return new WaitForSeconds(checkEverySeconds);

}<br>do last sth;<br>finish;<br>}

  

shader 中加Cull off 不遮挡,背部也能看到

InfiniLearning Game Development With Unity 3D.rar 第六章讲钢体,cloth ragdoll

camera.layerCullDistances 设置各层的fardistance ,可以把小物体放在合适的层,设置distance,离相机多远时不显示小物体

使用协同做时间冷却

direction = transform.TransformDirection(direction);

direction本来是世界坐标vector3, TransformDirection(里面基于自身local坐标系)将里面转为世界坐标值.

//摄像机按鼠标左右移动旋转

1

2

3

xAngl += Input.GetAxis ("Mouse X") * xSpeed * 0.02f;

Quaternion camRot = Quaternion.Euler (yAngl, xAngl, 0);

cam.rotation = camRot;

  

1

2

3

4

5

6

7

8

9

10

11

/** 按固定速度旋转

var target: Transform;

var rotateSpeed=30.0;

var t=float;

var q:Quaternion;

 

var wantedRotation=Quaternion.FromToRotation(transform.position,target.position);

t=rotateSpeed/Quaternion.Angle(transform.rotation,wantedRotation)*Time.deltaTime;

q=Quaternion.Slerp(transform.rotation, target.rotation,t);

transform.rotation=q;

**/

  


 

mecanim系统中 ,选中IK PASS OnAnimatorIK()里的对应层的IK动作才能起作用
anystate代表所有状态都能进入当条件为真时

Quaternion.SetLookRotation(z轴朝向的位置,y轴朝向的位置) 返回Quaternion;

当你启动Unity按住ALT键时,可以让你选择所需打开项目。(否则它将尝试更新最后打开的项目)

请问有没有遇到过 添加了第三方插件SDK之后 如果手机处于待机状态的时候 就会退出APP的情况的呢
北京-KL-程序(1557899269) 下午 18:11:28
有人提过改xml
android:configChanges="orientation|keyboardHidden|navigation|screenSize"


计算那么角色速度角速度。
flota speed = agent.desiredVelocity.magnitude;
Vector3 velocity = Quaternion.Inver(trnasform.rotation) * agent.desiredVelocity;
float angle = Mathf.Atan2(velocity.x, velocity.z)* 180.0f/3.14159f;
//当有rootMotion的时候OnAnimatorMove回调函数
agent.velocity =animator.deltaPosition/Time.deltatime
transform.rotation = animator.rootRotation;


By default Unity compresses all textures when importing. This can be turned off in the Preferences for faster workflow. But when building a game, all not-yet-compressed textures will be compressed.
默认情况下,Unity会在导入时对纹理进行压缩,为了加速工作,你可以在Preferences里关闭该功能,但是当编译游戏时,所有尚未被压缩纹理都将被重新压缩。

Guitext 屏幕坐标,x:0-1 y:0-1


欧拉角限制 绕y和z 为-180到180,即左右转,和左右倾斜 x为-90到90即前后倾斜

Layer的用法

LayerMask.NameToLayer("Ground");  // 通过名字获取layer

 

物理摄像头取色(WebCamTexture)

1

2

3

4

5

6

7

8

9

10

11

12

13

Texture2D exactCamData() { 

 

    // get the sample pixels 

 

    Texture2D snap = new Texture2D((int)detectSize.x, (int)detectSize.y); 

 

    snap.SetPixels(webcamTexture.GetPixels((int)detectStart.x, (int)detectStart.y, (int)detectSize.x, (int)detectSize.y)); 

 

    snap.Apply(); 

 

    return snap; 

 

}

  

保存截图:System.IO.File.WriteAllBytes(Application.dataPath + "/test.png", exactCamData().EncodeToPNG());

动画编码

http://www.cnblogs.com/lopezycj/archive/2012/05/18/Unity3d_AnimationEvent.html

http://game.ceeger.com/Components/animeditor-AnimationEvents.html

http://answers.unity3d.com/questions/8172/how-to-add-new-curves-or-animation-events-to-an-im.html

调试技巧(Debug)

可以在OnDrawGizmos函数来进行矩形区域等,达到调试的目的,请参考NGUI中的UIDraggablePanel.cs文件中的那个函数实现。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#if UNITY_EDITOR

    /// <summary>

    /// Draw a visible orange outline of the bounds.

    /// </summary>

    void OnDrawGizmos ()

    {

        if (mPanel != null)

        {

            Bounds b = bounds;

            Gizmos.matrix = transform.localToWorldMatrix;

            Gizmos.color = new Color(1f, 0.4f, 0f);

            Gizmos.DrawWireCube(new Vector3(b.center.x, b.center.y, b.min.z), new Vector3(b.size.x, b.size.y, 0f));

        }

    }

#endif

  Lerp函数的使用场景

1

2

// Set the health bar's colour to proportion of the way between green and red based on the player's health.

healthBar.material.color = Color.Lerp(Color.green, Color.red, 1 - health * 0.01f);

  在特定位置播放声音

1

2

// Play the bomb laying sound.

AudioSource.PlayClipAtPoint(bombsAway,transform.position);

  通过脚本修改shader中uniform的值

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

//shader的写法

Properties {

    ...

    disHeight ("threshold distance", Float) = 3

}

  

SubShader {

    Pass {

        CGPROGRAM

        #pragma vertex vert 

        #pragma fragment frag

        ...

        uniform float disHeight;

        ...

// ===================================

// 修改shader中的disHeight的值

gameObject.renderer.sharedMaterial.SetFloat("disHeight", height);

  双击事件

1

2

3

4

5

6

void OnGUI() {

    Event Mouse = Event.current;

    if ( Mouse.isMouse && Mouse.type == EventType.MouseDown && Mouse.clickCount == 2) {

        print("Double Click");

    }

}

  RootAnimation中移动的脚本处理

1

2

3

4

5

6

7

8

9

10

class RootControl : MonoBehaviour {

    void OnAnimatorMove() {

        Animator anim = GetComponent<Animator>();

        if(anim) {

            Vector3 newPos = transform.position;

            newPos.z += anim.GetFloat("Runspeed") * Time.deltaTime;

            transform.position = newPos;

        }

    }

}

  BillBoard效果(广告牌效果,或者向日葵效果,使得对象重视面向摄像机

1

2

3

4

5

6

public class BillBoard : MonoBehaviour {

    // Update is called once per frame

    void Update () {

        transform.LookAt(Camera.main.transform.position, -Vector3.up);

    }

}

  script中的属性编辑器(Property Drawers),还可以自定义属性编辑器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

public class Example : MonoBehaviour {

    public string playerName = "Unnamed";

 

    [Multiline]

    public string playerBiography = "Please enter your biography";

 

    [Popup ("Warrior""Mage""Archer""Ninja")]

    public string @class "Warrior";

 

    [Popup ("Human/Local""Human/Network""AI/Easy""AI/Normal""AI/Hard")]

    public string controller;

 

    [Range (0, 100)]

    public float health = 100;

 

    [Regex (@"^(?:\d{1,3}\.){3}\d{1,3}$""Invalid IP address!\nExample: '127.0.0.1'")]

    public string serverAddress = "192.168.0.1";

 

    [Compact]

    public Vector3 forward = Vector3.forward;

 

    [Compact]

    public Vector3 target = new Vector3 (100, 200, 300);

 

    public ScaledCurve range;

    public ScaledCurve falloff;

 

    [Angle]

    public float turnRate = (Mathf.PI / 3) * 2;

}

  debug下画线

  Debug.DrawLine (Vector3.zero, new Vector3 (10, 0, 0), Color.red);  

 

获取AnimationCurve的时长

1

_curve.keys[_curve.length-1].time;

  使得脚本能够在editor中实时反映:

在脚本前加上:[ExecuteInEditMode], 参考UISprite。

    NGUI类关系图

//在2秒内使颜色变黑。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

function Update ()

 

{

    light.color-= Color.white / 2.0 * Time.deltaTime;

}

//在2个颜色之间来回插值光源颜色。

var duration =1.0;

var color0 = Color.red;

var color1 = Color.blue;

function Update ()

 

{

   //设置光源颜色

   var t = Mathf.PingPong (Time.time, duration) / duration;

    light.color= Color.Lerp (color0, color1, t);

}

  

 

 

//随时间改变光照强度

1

2

3

4

5

6

7

8

9

10

11

var duration = 1.0;

function Update()

 

{

   //余弦理论

   var phi = Time.time / duration * 2 * Mathf.PI;

   //获取余弦,并将范围从-1~1变为0~1

   var amplitude = Mathf.Cos( phi ) * 0.5 + 0.5;

   //设置光的颜色

   light.intensity = amplitude;

}

  

 

描述:光源的范围。
即使光源关闭了attenuate,它还是只影响在它范围内的物体。

1

2

3

4

5

6

7

8

9

10

11

12

13

//在原始范围与原始范围一般处变换光照范围

var duration =3.0;

private var originalRange : float;

originalRange = light.range;

function Update()

 

{

    var amplitude = Mathf.PingPong( Time.time,duration );

    //将0..持续时间改为0.5..1范围

    amplitude = amplitude / duration * 0.5 + 0.5;

    //设置光照范围

    light.range = originalRange * amplitude;

}

  

var renderMode :LightRenderMode

描述:如何渲染该光源?此处可以是LightRenderMode.Auto,LightRenderMode.ForceVertex 或LightRenderMode.ForcePixel。像素光渲染比较慢但是看起来较好,尤其是对那些没有较高面数的几何体。一些效果(例如凹凸)只会在像素光照下显示。

 

Cancellnvoke():void

描述:取消所有在这个MonoBehaviour上调用

Cancellvoke(methodName:string):void

描述:撤销该行为中名为methodName的所有调用。

Invoke  and    InvokeRepeating

 

描述:OnBecameInvisible函数在渲染上的脚本。OnBecameVisible和OnBecameInvisible可以用于只需要在需要在物体可见时才进行的计算。
//当它不可见时禁用这个行为
function OnBecameInvisible()

{
   enabled=false;
}

OnBecameInvisible可以是一个coroutine,简单地在这个函数中使用yield语句。当在编辑器中运行时,场景试图相机也会导致这个函数被调用。

 

 

functiononParticleCollision(other:GameObject):void

描述:当一个粒子碰到一个碰撞器时OnParticleCollision被调用。
这个可以在游戏物体被粒子击中时应用伤害到它的上面,这个消息被发送到所有附加到
WorldParticleCollider 的脚本上和被击中的Collider上,这个消息只有当你在
WorldParticleCollider检视面板中启用了sendCollisionMessage时才会被发送。
//应用力到所有被粒子击中的刚体上

 

1

2

3

4

5

6

7

8

9

10

11

12

functionOnParticleCollison(other:GameObject)

 

{

   varbody=other.rigidbody;

   if(body)

 

  {

    var direction=other.transform.position+transform.position;

    direction=direction.normalized;

    body.AddForce(direction*5);

   }

}

  

OnParticleCollision可以是一个coroutine,简单地在这个函数中使用yield语句。

 

function OnpostRender():void


描述:OnPostRender在相机渲染场景之后调用。
只有脚本被附加到相机上时才会调用这个函数。OnPostRender可以是一个coroutine,简单地在这个函数中使用yield语句。
OnPostRender在相机渲染完所有它的物体之后被调用。如果你想在所有相机和GUI被渲染之后做一些事情,使用WaitForEndFramecoroutine
参见:OnPreRender,WaitForEndOfFrame
//当附加到机时,将消除
//相机纹理的alpha通道为纯白色
//如果你有一个渲染纹理并想将它显示在GUI上时可以使用这个函数

1

2

3

4

5

6

7

8

9

10

11

private varmat:Material;

function OnPostRender()

 

{

    //创建一个只渲染白色到alpha通道的着色器

   if(mat)

    {

      mat=newMaterial(“Shader Hidden SetAlpha”+)

    “SubShader{“+”pass{”+”ZTest Always Cull off ZwriteOff”+”ColorMaskA”+”Color  (1,1,1,1)”+”}”+”}”+”}”);

    }

}

  

 

// 用上述着色器绘制一个全屏四边形

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

GL.PushMatrix();

GL.LoadOrtho();

for(var i=0;i<mat.pssCount;++i)

 

{

  mat.SetPass(i);

  GL.Begin(GL.QUADS);

  GL.Vertex3(0,0,0.1);

  GL.Vertex3(1,0,0.1);

  GL.Vertex3(1,1,0.1);

  GL.Vertex3(0,1,0.1);

  GL.End();

 }

 GL.PopMatrix();

}

  

 

function OnRender():void

描述:OnpreRender在相机开始渲染场景之前调用。
只用脚本被附加到相机上时才会调用这个函数。
注意如是果你在这里改变了相机的视野参数(例如fieldOfView),它们将影响下一帧。用OnPreCull代替。

 

强烈建议使用DestroyImmediate 代替 Destroy。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

OnCollisionEnter(collision:Collision)

 

{

    //调试绘制所有的接触点和法线

    for(varcontact:ContacePoint in collision.contacts)

 

   {

        Debug.DrawRay(contact.point,contact.normal,color.white);

    }

    //如果碰撞物体有较大的冲击就播放声音

   if(collision.relativeVelocity.magnitude.2)

    Audio.Play();

 }

  

U3D屏幕截图 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

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脚本周期关系  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值