Model&Animation

Model&Animation

1、FBX文件是一个完整的模型,通常内含Mesh,Material,Texture,Animation,即内含构成一个完成GameObject所需要的一切组件。可以通过以下代码来引用。

Model&Animation
 1     //动画名称
 2     public const string ANIM_NAME0="idle";
 3     public const string ANIM_NAME1="run";
 4     public const string ANIM_NAME2="walk";
 5     public const string ANIM_NAME3="jump_pose";
 6     //模型对象
 7     private GameObject obj = null;
 8 
 9     void Start ()
10     {
11         //获取模型动画
12         obj = GameObject.Find("Constructor");
13         //设置动画播放类型为循环
14         obj.animation.wrapMode = WrapMode.Loop;
15     }
16     
17     void Update ()
18     {
19         //按键后播放不同动画
20         if (Input.GetKeyDown (KeyCode.A))
21         {
22             obj.animation.Play(ANIM_NAME0);
23         }
24         if (Input.GetKeyDown (KeyCode.B))
25         {    
26             obj.animation.Play(ANIM_NAME1);
27         }
28         if (Input.GetKeyDown (KeyCode.C))
29         {    
30             obj.animation.Play(ANIM_NAME2);
31         }
32         if (Input.GetKeyDown (KeyCode.D))
33         {    
34             obj.animation.Play(ANIM_NAME3);
35         }
36     }
View Code

2、通过Animation组件的AddClip()、PlayQueued()可以实现动画剪辑与合并。

Model&Animation
 1     //模型对象
 2     private GameObject obj = null;
 3     
 4     void Start () 
 5     {
 6         //得到模型动画
 7         obj = GameObject.Find("man");
 8         
 9     }
10     
11     void OnGUI()
12     {
13        if(GUILayout.Button("播放完整动画"))
14        {
15                //这里播放默认动画,默认动画及完整150帧动画
16                obj.animation.Play();    
17        }
18        
19        if(GUILayout.Button("切割动画0-50帧"))
20        {
21                //切割动画,播放第0帧到第50帧
22                PlayCuttingAnimation(obj,0,50);
23        }
24        
25        if(GUILayout.Button("合并动画0-50帧与100-150帧"))
26        {
27                //合并动画,将第0帧到第50帧与第100帧到第150帧两组动画合并在一起播放
28                PlayCombinedAnimation(obj,0,50,100,150);
29        }
30     }
31     
32     public void PlayCuttingAnimation(GameObject manObject,int startFrame,int endFrame)
33     {        
34             
35             AnimationClip clip = manObject.animation.clip;
36             //添加一个剪辑,设置起始帧与结束帧
37             manObject.animation.AddClip(clip, "cutClip", startFrame, endFrame);
38             manObject.animation.Play("cutClip");                
39     }
40     
41     public void PlayCombinedAnimation(GameObject manObject,int startFrame0,int EndFrame0,int startFrame1,int EndFrame1)
42     {
43             AnimationClip clip = manObject.animation.clip;
44             //添加两个剪辑,设置起始帧与结束帧
45             manObject.animation.AddClip(clip,"startClip",startFrame0,EndFrame0,false);
46             manObject.animation.AddClip(clip,"endClip",startFrame1,EndFrame1,false);
47             //以队列的形式播放这两个剪辑,保证第一个动画播放完毕在播放第二个动画
48             manObject.animation.PlayQueued("startClip", QueueMode.PlayNow);
49             manObject.animation.PlayQueued("endClip", QueueMode.CompleteOthers);
50     }
View Code

3、可以使用方法animation.animation["clip名称"].length来获取播放的时间。

Model&Animation
 1     void Start () 
 2     {
 3         //得到模型动画
 4         obj = GameObject.Find("man");
 5         //得到动画播放长度
 6         animLegth = obj.animation.animation[ANIM_NAME].length;
 7     }
 8     
 9     void OnGUI()
10     {
11        //显示信息
12        string show = "当前动画长度:"+hSliderValue.ToString() +"(s)"+ " / " + animLegth.ToString()+"(s)";
13        GUILayout.Label(show);
14        //计算拖动条拖动数值
15        hSliderValue = GUILayout.HorizontalSlider(hSliderValue, 0.0F, 5.0F,GUILayout.Width(200));
16        //绘制动画帧
17        PlaySilderAnimation(obj,hSliderValue);
18     
19     }
20     
21     public void PlaySilderAnimation(GameObject manObject,float times)
22     {
23             
24             //播放动画
25             if(!manObject.animation.IsPlaying(ANIM_NAME))
26             {
27                 manObject.animation.Play(ANIM_NAME);
28             }
29             //设置动画时间
30             manObject.animation.animation[ANIM_NAME].time = times;
31     }
View Code

4、使用OpenGL。必须在OnPostRender()中才能使用。

 

Model&Animation
 1     //绘制线段在职
 2     public Material material;
 3     
 4     //此绘制方法由系统调用
 5     void OnPostRender() 
 6     {
 7         if (!material) 
 8         {
 9             Debug.LogError("请给材质资源赋值");
10             return;
11         }
12         //设置该材质通道,0为默认。
13         material.SetPass(0);
14         //设置绘制2D图像
15         GL.LoadOrtho();
16         //标志GL开始绘制,绘制类型为线段
17         GL.Begin(GL.LINES);
18         //绘制线段0
19         DrawLine(0,0,200,100);
20         //绘制线段1
21         DrawLine(0,50,200,150);
22         //绘制线段2
23         DrawLine(0,100,200,200);
24         //结束绘制
25         GL.End();
26     }
27     
28     void DrawLine(float x1,float y1,float x2,float y2)
29     {
30         //绘制线段,需要坐标点除以屏幕宽或高
31         GL.Vertex(new Vector3(x1/Screen.width, y1/Screen.height, 0));
32         GL.Vertex(new Vector3(x2/Screen.width, y2/Screen.height, 0));
33     }
View Code

 

5、使用GL绘制鼠标轨迹实例。

Model&Animation
 1     private List<Vector3> lineInfo;
 2     
 3     void Start()
 4     {
 5         //初始化鼠标线段链表
 6         lineInfo  = new List<Vector3>();
 7     }
 8     
 9     void Update() 
10     {
11         //将每次鼠标改变的位置储存进链表
12         lineInfo.Add(Input.mousePosition);
13     }
14     void OnGUI()
15     {
16          GUILayout.Label("当前鼠标x轴位置:"+Input.mousePosition.x);
17          GUILayout.Label("当前鼠标y轴位置:"+Input.mousePosition.y);
18     }
19     
20     //此绘制方法由系统调用
21     void OnPostRender() {
22         if (!material) 
23         {
24             Debug.LogError("请给材质资源赋值");
25             return;
26         }
27         //设置该材质通道,0为默认。
28         material.SetPass(0);
29         //设置绘制2D图像
30         GL.LoadOrtho();
31         //标志GL开始绘制,绘制类型为线段
32         GL.Begin(GL.LINES);
33         //得到鼠标点信息总数量
34         int size = lineInfo.Count;
35         //遍历鼠标点的链表
36         for(int i =0; i< size-1; i++)
37         {
38             Vector3 start = lineInfo[i];
39             Vector3 end = lineInfo[i+1];
40             //绘制线
41             DrawLine(start.x,start.y,end.x,end.y);
42         }
43         
44         //结束绘制
45         GL.End();
46     }
47     
48     void DrawLine(float x1,float y1,float x2,float y2)
49     {
50         //绘制线段,需要坐标点除以屏幕宽或高
51         GL.Vertex(new Vector3(x1/Screen.width, y1/Screen.height, 0));
52         GL.Vertex(new Vector3(x2/Screen.width, y2/Screen.height, 0));
53     }
View Code

6、使用GL绘制方形。

Model&Animation
 1     //可用材质
 2     public Material mat0;
 3     public Material mat1;
 4     public Material mat3;
 5     
 6     void OnPostRender() {
 7     
 8         //绘制正四边方形
 9         DrawRect(100,100,100,100,mat0);
10         DrawRect(250,100,100,100,mat1);
11         //绘制无规则四边形
12         DrawQuads(15,5,10,115,95,110,90,10,mat3);
13     }
14     
15     /**
16      绘制正四边形
17      float x :X轴起始坐标
18      float y :Y轴起始坐标 
19      float width :正四边形的宽
20      float height :正四边形的高  
21     */
22     void DrawRect(float x,float y,float width,float height,Material mat)
23     {
24         GL.PushMatrix();
25         mat.SetPass(0);
26         GL.LoadOrtho();
27         //绘制类型为四边形
28         GL.Begin(GL.QUADS);
29         
30         GL.Vertex3(x/Screen.width, y/Screen.height, 0);
31         GL.Vertex3(x/Screen.width, (y + height)/Screen.height, 0);
32         GL.Vertex3((x+ width)/Screen.width, (y + height)/Screen.height, 0);
33         GL.Vertex3((x+ width)/Screen.width,y/Screen.height, 0);
34         
35         GL.End();
36         GL.PopMatrix();
37     }
38     
39     /**
40      绘制无规则四边形
41      float x1 :起始点1,X1坐标
42      float y1 :起始点1,Y1坐标
43      float x2 :起始点2,X2坐标
44      float y2 :起始点2,X2坐标 
45      float x3 :起始点3,X3坐标
46      float y3 :起始点3,X3坐标 
47      float x4 :起始点4,X4坐标
48      float y4 :起始点4,X4坐标
49     */
50     
51     void DrawQuads(float x1,float y1,float x2,float y2,float x3,float y3,float x4, float y4,Material mat)
52     {
53         GL.PushMatrix();
54         mat.SetPass(0);
55         GL.LoadOrtho();
56         //绘制类型为四边形
57         GL.Begin(GL.QUADS);
58         
59         GL.Vertex3(x1/Screen.width, y1/Screen.height, 0);        
60         GL.Vertex3(x2/Screen.width, y2/Screen.height, 0);    
61         GL.Vertex3(x3/Screen.width, y3/Screen.height, 0);    
62         GL.Vertex3(x4/Screen.width, y4/Screen.height, 0);    
63         
64         GL.End();
65         GL.PopMatrix();
66     }
View Code

7、使用LineRender。

Model&Animation
 1     //线段对象
 2     private GameObject LineRenderGameObject;  
 3       
 4     //线段渲染器  
 5     private LineRenderer lineRenderer;  
 6       
 7     //设置线段的顶点数,4个点确定3条线段
 8     private int lineLength = 4;  
 9       
10     //记录4个点,连接一条线段  
11     private Vector3 v0 = new Vector3(1.0f,0.0f,0.0f);  
12     private Vector3 v1 = new Vector3(2.0f,0.0f,0.0f);  
13     private Vector3 v2 = new Vector3(3.0f,0.0f,0.0f);  
14     private Vector3 v3 = new Vector3(4.0f,0.0f,0.0f);  
15       
16     void Start()
17     {  
18         //获得线段游戏对象
19         LineRenderGameObject = GameObject.Find ("ObjLine");  
20         //获得线渲染器组件
21         lineRenderer = (LineRenderer)LineRenderGameObject.GetComponent ("LineRenderer");   
22         //设置线的顶点数
23         lineRenderer.SetVertexCount(lineLength);  
24         //设置线的宽度
25         lineRenderer.SetWidth(0.1f,0.1f);
26     }     
27                    
28       
29     void Update() {  
30         
31         //使用这4个顶点渲染3条线段    
32         lineRenderer.SetPosition (0, v0);  
33         lineRenderer.SetPosition (1, v1);  
34         lineRenderer.SetPosition (2, v2);  
35         lineRenderer.SetPosition (3, v3);  
36   
37     }  
View Code

8、MeshFilter指定使用哪个Mesh,MeshRender指定使用哪个Material以及渲染属性。Mesh包含VertexMesh和NormalMesh。

Model&Animation

上一篇:poj 2653


下一篇:bionase