zoukankan      html  css  js  c++  java
  • Model&Animation

    Model&Animation

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

     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()可以实现动画剪辑与合并。

     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来获取播放的时间。

     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()中才能使用。

     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绘制鼠标轨迹实例。

     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绘制方形。

     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。

     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。

  • 相关阅读:
    python-study-08
    第一周代码整理
    python-study-阶段总结
    python-study-07
    二分查找数组中与目标数字(可以是浮点型)最近的数的位置
    寻找最大数
    零件分组(stick)
    走迷宫
    自然数的拆分问题 字典序
    素数环(回溯)
  • 原文地址:https://www.cnblogs.com/tekkaman/p/3537697.html
Copyright © 2011-2022 走看看