XLT的unity3D学习笔记(一)

写在最前面的废话:我是一名正在实习的大四狗,因为曾级和几个同学一起开发过独立小游戏的缘故,所以接触到了unity3D这款引擎并且自学过一段时间unity3D开发的相关知识。如今在实习期间又接触到了它,并且开始真正的使用unity3D开发实际的项目,才发现之前所了解到的不过是冰山一角,管中窥豹。因此,准备在这里把所学习到的一些东西记录下来。不过由于记录的内容大多是我的一些想法或是解决遇到的问题,所以这一系列的笔记并没有什么顺序可言。
PS:我的水平有限,文中难免会出现有失偏妥之处,所以随时欢迎高手指正和交流:)

 1.avatar与骨骼动画

说起来也惭愧,实习期间我遇到的第一个问题就是关于avatar以及骨骼动画的。在许多游戏中,人物的转身动作实现的比较粗糙,以向右转身为例子,有的就是直接将人物模型整体旋转90度,这样的实现最为简单,但是看上去人物就仿佛在“滑动”。这与人类正常转身的动作差距较大,看上去会很不自然。所以在公司里老司机的建议下,外加参考真实人类的转身,我觉得可以把转身这个动作分为上半身和下半身两个部分进行,即上半身从头开始先逐步旋转(需要注意的是在转身时,一般我们都是头先转动到目标方向,然后才是胸,腰,腹部,以及下半身)然后再转动下半身。这样是否就可以省去制作一个转身的动画呢?于是我开始了尝试。

视角回到unity项目中,在unity的Mecanim动画系统中,avatar起着至关重要的作用。通常来说,制作带骨骼的人物模型的时候一般都是使用外部的专业建模软件,当我们将这些模型导入unity中并希望控制它们播放合适的动画的时候,就需要使用avatar进行代理来访问并控制这些模型的骨骼节点来实现相应的动作。下图就是一个普通的带骨骼的人类模型:
XLT的unity3D学习笔记(一)_第1张图片

打开它对应的avatar可以看到一个与之对应的全身骨骼节点:
XLT的unity3D学习笔记(一)_第2张图片

既然Mecanim动画系统是通过avatar访问骨骼上的每个节点的,那如果unity提供相应的API我们就应该可以通过代码直接访问并控制这些骨骼节点的行为,于是乎我在查看unity相关的文档后果然找到了。就是这个:
http://docs.unity3d.com/ScriptReference/Animator.GetBoneTransform.html
阅读文档中的解释可以看到我们可通过控制该模型的animator中的GetBoneTransform这个函数来访问各个骨骼节点,而且它返回的是这个节点的tranform,这样一样可以干的事情就很多了。我可以依次获得上半身所有主要关节的transform,来控制它们的转动就可以了。
控制上半身旋转的代码如下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class test : MonoBehaviour {
    private Animator Ani;
    private List BodyBones = new List();
    // Use this for initialization
    void Start() {
        Ani = GetComponent();
        BodyBones.Add(Ani.GetBoneTransform(HumanBodyBones.Spine));          //腰部节点
        BodyBones.Add(Ani.GetBoneTransform(HumanBodyBones.Chest));          //胸部节点
        BodyBones.Add(Ani.GetBoneTransform(HumanBodyBones.Neck));           //脖子节点
        BodyBones.Add(Ani.GetBoneTransform(HumanBodyBones.Head));           //头节点
    }

    // Update is called once per frame
    void Update() {
        UpperTurn();
    }

    void UpperTurn() {
        float TurnSpeed = 0.5f;
        foreach(Transform BB in BodyBones)                                  //依次对拿到的上半身的节点进行旋转,需要注意各节点的朝向
        {
            BB.Rotate(TurnSpeed,0,0);
        }   
    }
}

跑起来就可以看到上半身旋转的时候会有一个层次性,但是这种方法也有缺点局限性,那就是只能旋转最多90度左右,不然模型会发生很奇怪的形变,以上大概就算是我的第一个小小的研究,也是这个系列的挖下的第一个坑吧:)

你可能感兴趣的:(unity学习笔记,unity3d,游戏)