Unity Animation采样和自定义属性

发表于2018-08-08
评论0 5k浏览
介绍Animation采样和自定义Animation属性动画之前,大家需要了解这两部分的内容: 
1、了解Animation的采样函数Sample怎么使用。  
2、了解自定义属性面板  
动画的采样可用于自定义编辑器等工具,也可以自己实现一套动画系统。

首先看一下自定义属性面板,网上都有相关代码和教程,在这里粘贴一处网上的代码,如果冒犯,望海涵~  
using UnityEngine;
using System.Collections;
public class MyRangeAttribute : PropertyAttribute
{
    public float min;
    public float max;
    public string label;
    public MyRangeAttribute( float min, float max, string label = "")
    {
        this.min = min;
        this.max = max;
        this.label = label;
    }
}
using UnityEngine;
using UnityEditor;
using System.Collections;
//该代码放在Editor目录下
[CustomPropertyDrawer(typeof(MyRangeAttribute))]
public class MyRangeAttributeDrawer : PropertyDrawer 
{
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        MyRangeAttribute range = this.attribute as MyRangeAttribute;
        if( property.propertyType == SerializedPropertyType.Float )
        {
            if (range.label != string.Empty)
            {
                label.text = range.label;
            }
            EditorGUI.Slider(position, property, range.min, range.max, label);
        }
        else if( property.propertyType == SerializedPropertyType.Integer )
        {
            if( range.label != string.Empty )
            {
                label.text = range.label;
            }
            EditorGUI.IntSlider(position, property, (int)range.min, (int)range.max, label);
        }
    }
}

动画采集及自定义属性使用:
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class AnimationTest : MonoBehaviour 
{
    public Animation anim;
    [MyRangeAttribute(0f,1f,"动画采样")]
    public float curValue = 0f;
    float deltaTime = 0f;
    float lastFrameTime = 0f;
    float progressTime = 0f;
    string clipName = "run";
	void Start () 
    {
        anim.enabled = false;
        AnimationState state = anim[clipName];
        state.enabled = true;
        state.weight = 1;
        state.normalizedTime = 0;
        anim.Sample();
        state.enabled = false;
	}
	// Update is called once per frame
	void Update () 
    {
        deltaTime = Time.realtimeSinceStartup;
        progressTime += deltaTime - lastFrameTime;
        Example();
        lastFrameTime = deltaTime;
	}
    void Example()
    {
        AnimationState animState = anim[clipName];
        animState.enabled = true;
        animState.speed = 1f;
        animState.weight = 1;
        if (curValue > 1f)
        {
            curValue = 0f;
        }
        animState.normalizedTime = curValue;
        anim.Sample();
        animState.enabled = false;
    }
}

这样就可以自由操作动画的播放了:

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引