一、Animation

1.描述

  Animation组件用于播放动画。

  你可以将Animation Clips指定给Animation组件,并从脚本控制播放。Unity中的动画系统是基于权重的,支持Animation Blending,添加动画,Animation Mixing,Layers以及对播放各个方面的完全控制。

  AnimationState可用于更改动画的Layer,修改播放速度以及直接控制blending和mixing。

  Animation也支持enumerators.循环比遍历所有AnimationStates的方式如下:

Unity AVProVideo AudioOutput怎么用 unity animation api_代码示例


Unity AVProVideo AudioOutput怎么用 unity animation api_unity_02

using System.Collections;
using UnityEngine;

public class AnimationStateForEach : MonoBehaviour
{
    public Animation anim;
    void Start()
    {
        anim = GetComponent<Animation>();
        foreach(AnimationState state in anim)
        {
            state.speed = 0.5f;
            Debug.Log("this is animation state : " + state.name);
        }
    }
}

2.Properties

animatePhysics:打开时,动画将在物理循环中执行。这仅适用于Kinematic rigidbodies(运动刚体).动画平台可以将速度和摩擦力应用于其上的rigidbodies(刚体).为了使用它,必须启用animatePhysics,并且动画对象必须是kinematic rigidbody(运动刚体)。
函数定义:public bool animatePhysics
clip:默认动画
函数定义:public AnimationClip clip
cullingType:控制此Animation组件的Culling
函数定义:public AnimationCullingType cullingType;
isPlaying:目前是否正在播放动画。
函数定义:public bool isPlaying
localBounds:此animation组件在局部空间的AABB。默认情况下,它是基于animation state(即附加的Animation Clip)计算的,除非用户通过将值设置为localBounds来覆盖它。
函数定义:public Bounds localBounds.
playAutomatically:默认animation clip(Animation.clip属性)是否应该在启动时自动开始播放
函数定义:public bool playAutomatically
this[string]:返回对应name的animation state.
函数定义:public AnimationState this[string];
代码示例:
using UnityEngine;

public class AnimationStateForEach : MonoBehaviour
{
    public Animation anim;
    private void Start()
    {
        anim["walk"].speed = 2.0f;
        anim["run"].weight = 0.5f;
    }
}
wrapMode:如何处理超出剪辑播放范围的时间。
函数定义:public WrapMode wrapMode

3.Public Methods

AddClip:将clip添加到名为newName的动画中。添加的剪辑只在firstFrame和lastFrame之间播放,且以newName的名字添加到Animation中。如果已存在具有该名称的剪辑,则将替换为新剪辑。
函数定义:
public void AddClip(Animation clip,string newName);
public void AddClip(Animation clip,string newName,int firstFrame,int lastFrame,bool addLoopFrame = false);
函数参数:
addLoopFrame:是否应在与第一帧匹配的末尾插入额外的帧?如果要制作循环动画,请启用此选项。
Blend:在下一个时间点将名称为animation的动画以targetWeight权重混合,其他动画的播放不会受到影响。
函数定义:public void Blend(string animation,float targetWeight = 1.0F,float fadeLength = 0.3f);
CrossFade:在一段时间内使用名称为animation的动画淡出淡入其他动画。如果mode设置为PlayMode.StopSameLayer,则与animation相同Layer的动画将在淡入动画时淡出。如果mode为PlayMode.StopAll,则动画淡入时所有动画都将淡出。如果动画未设置为looping,则将在播放后停止并重绕。
函数定义:public void CrossFade(string animation,float fadeLength = 0.3F,PlayMode mode = PlayMode.StopSameLayer);
CrossFadeQueued:在之前的动画播放完毕后,淡入淡出下一个动画。例如:你可以在各个动画播放之后播放特定的动画序列。动画在播放前复制自身,因此你可以再相同的动画间渐变,这可用来重叠两个相 同的动画。例如你可能有一个挥剑的动画,玩家快速挥动了2次,你可以回放这个动画并从开始播放它,但会跳帧。可以使用以下队列模式:如果queue为QueueMode.CompleteOthers,则之后在所有其他动画停止播放后才会启动此动画。如果queue为QueueMode.PlayNow,则此动画将立即开始播放重复的动画状态。动画播放完毕后,它会自动清理。完成后使用复制的动画状态将导致异常。
函数定义:public AnimationState CrossFadeQueued(string animation,float fadeLength = 0.3F,QueueMode queue = QueueMode.CompleteOthers,PlayMode mode = PlayMode.StopSameLayer);
GetClipCount:获取当前分配给此动画的剪辑数。
函数定义:public int GetClipCount();
IsPlaying:名字为name的动画是否正在播放。
函数定义:public bool IsPlaying(string name)
Play:不混合的播放动画。这是一项遗留功能,不建议使用。请使用Animator.Play。如果未提供名称,则将播放默认动画。如果无法播放动画(例如,当没有默认动画或没有指定名称的动画时),该函数将返回false.可选的PlayMode可让你选择此动画将如何影响已播放的其他动画。如果指定的动画已经播放,则其他动画将停止,但动画不会回放到开头。动画播放结束时,除非PlayMode设置为循环,否则它将自动停止并重新开始。如果在帧更新期间在对象上调用Animation.Play,其中对象未激活,则将取消调用。稍后重新激活对象时,动画也不会开始播放。但是,如果在后续帧上调用(当对象仍处于非激活状态时),则动画将在重新激活后开始播放。要使用Animation.Play,动画数据必须在Inspector窗口中可见。该窗口在一个数组中包含GameObject的所有动画。
函数定义:
public bool Play(PlayMode mode = PlayMode.StopSameLayer);
public bool Play(string animation,PlayMode = mode = PlayMode.StopSameLayer);
代码示例:两个动画jump和spin存储在Animations列表中。Animation.Play可以播放这些动画中的每一个。Animation.Play可以单独播放这些动画,也可以组合播放这些动画。一个(不支持和未记录的)AnimationState.layer用于此目的。例如在第0Layer离开跳跃并将旋转移动到第123Layer将允许他们一起播放。
using UnityEngine;

//使用S和J键开始spin或者jump动画。使用Space键同时播放spin和jump动画。
//使用Z将让spin和jump的旋转速度加倍。
//Spin:将立方体旋转半度或一秒钟
//Jump:向上反弹最多两个单位,然后在一秒钟内下来。
//注意:不再支持AnimationState.layer,但仍然存在。

public class AnimationStateForEach:MonoBehaviour
{
    private Animation anim;
    private void Start()
    {
        anim = gameObject.GetComponent<Animation>();
        anim["spin"].layer = 123;
    }
    //如果未真,旋转速度加倍
    private bool fastSpin = false;
    private void Update()
    {
        if(anim.isPlaying)
        {
            return;
        }
        if(Input.GetKeyDown(KeyCode.S))
        {
            Debug.Log("Spinning");
            anim.Play("jump");
        }
        if(Input.GetKeyDown(KeyCode.Space))
        {
            Debug.Log("Jumping and spinning");
            anim.Play("jump");
            anim.Play("spin");
        }
        if(fastSpin == true)
        {
            anim["spin"].speed = 1.0f;
            fastSpin = false;
        }
        if(Input.GetKeyDown(KeyCode.Z))
        {
            Debug.Log("Jumping and spinning in half a second");
            anim.Play("jump");
            anim["spin"].speed = 2.0f;
            anim.Play("spin");
            fastSpin = true;
        }
    }
}
PlayQueued:在上一个动画播放完毕后播放动画。例如,你可以在任何动画播放完之后播放特定的动画.动画在播放前复制自身,因此你可以再相同的动画间渐变,这可用来重叠两个相 同的动画。例如你可能有一个挥剑的动画,玩家快速挥动了2次,你可以回放这个动画并从开始播放它,但会跳帧。可以使用以下队列模式:如果queue为QueueMode.CompleteOthers,则之后在所有其他动画停止播放后才会启动此动画。如果queue为QueueMode.PlayNow,则此动画将立即开始播放重复的动画状态。动画播放完毕后,它会自动清理。完成后使用复制的动画状态将导致异常。
函数定义:public AnimationState PlayQueued(string animation,QueueMode queue = QueueMode.CompleteOthers,PlayMode mode = PlayMode.StopSameLayer);
RemoveClip:从动画列表中移除剪辑。
函数定义:
public void RemoveClip(AnimationClip clip):这将删除剪辑以及基于它的任何动画状态。
public void RemoveClip(string clipName):这将删除与名称匹配的动画状态。
Rewind
函数定义:
public void Rewind(string name):倒回名为name的动画
public void Rewind():倒回所有动画
Sample:在当前状态下对动画进行采样。当你明确要设置某个动画状态并对其进行一次采样时,这非常有用。
函数定义:public void Sample()
Stop
函数定义:
public void Stop():停止使用此动画启动的所有播放动画。停止动画也会将其倒回开始。
public void Stop(string name):停止名为name的动画。停止动画也会将其倒回开始。

4.Inherited Members
(1).Properties

Behaviour.enabled:为true则启用update,否则禁止
函数定义:public bool enabled;
代码示例:这显示在脚本在Inspector的复选框中。
using UnityEngine;
using UnityEngine.UI;

public class AnimationStateForEach:MonoBehaviour
{
    public Image pauseMenu;
    public void Start()
    {
        pauseMenu.enabled = true;
    }
}
Behaviour.isActiveAndEnabled:脚本是否已激活且已启用。GameObject可以是激活的也可以是不激活的。同样脚本也可以激活或者不激活。如果GameObject处于活动状态且具有激活的脚本,则isActiveAndEnabled将返回true,否则返回false。
函数定义:public bool isActiveAndEnable
代码示例:
using UnityEngine;
using UnityEngine.UI;

public class AnimationStateForEach:MonoBehaviour
{
    public Image pauseMenu;
    public void Update()
    {
        if(pauseMenu.isActiveAndEnabled)
        {
            Debug.Log("Enabled");
        }
    }
}
Component.gameObject:此组件附加到的游戏对象。组件始终附加到游戏对象上。
函数定义:
public GameObject gameObject;
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        print(gameObject.name);
    }
}
Component.tag:这个GameObject的tag。tag可用于识别游戏对象。在使用标签之前,必须在Tag以及Layers管理器中声明他们。注意:你不应该从Awake()或OnValidate()方法设置标记。这是因为组件调用awake()的顺序是不确定的,因此可能导致意外行为,例如:tag在被唤醒时被覆盖。如果你尝试这样做,Unity将生成警告"SendMessage cannot be called during Awake,CheckConsistency,or OnValidate".
函数定义:public string tag;
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        Debug.Log("Transform Tag is : " + gameObject.tag);
    }
}
Component.transform:附加到此GameObject的Transform。
函数定义:public Transform transform.
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        transform.Translate(1, 1, 1);
    }
}
Object.hideFlags:隐藏对象,使用场景保存还是用户可修改。
函数定义:public HideFlags hideFlags;
Object.name:对象的名称。组件与游戏对象和所有附加组件共享相同的名称。如果一个类派生自MonoBehaviour,它将从MonoBehaviour继承"name"字段。如果此类也附加到GameObject,则"name"字段将设置为GameObject的名称。
函数定义:public string name;
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    public GameObject exampleOne;
    public GameObject exampleTwo;
    public GameObject exampleThree;
    private void Start()
    {
        exampleOne.name = "Ben";
        exampleTwo.name = "Ryan";
        exampleThree.name = "Oscar";
        Debug.Log("The names of these three object are " + exampleOne.name + ":" + exampleTwo.name + ":" + exampleThree.name);
    }
}

(2).Public Methods

Component.BroadcastMessage:在此游戏对象或其任何子对象的每个MonoBehaviour上调用名为methodName的方法。接收方法可以选择通过领参数忽略参数。如果将选项设置为SendMessageOptions.RequireReceiver,则在任何组件未拾取消息时将打印错误。
函数定义:
public void BroadcastMessage(string methodName,object parameter = null,SendMessageOptions options = SendMessageOptions.RequireReceiver);
public void BroadcastMessage(string methodName,SendMessageOptions options)
函数参数:
1.methodName:调用的函数名称
2.parameter:传递给方法的可选参数(可以是任何值)
3.options:如果给定目标对象的方法不存在,是否应该引发错误
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
   void Start()
    {
        BroadcastMessage("ApplyDamage", 5.0);
    }
    void ApplyDamage(float damage)
    {
         //附加到游戏对象及其所有子节点的每个脚本都调用ApplyDamage函数
        print(damage);
    }
}
Component.CompareTag:这个游戏对象是此标签标记的吗?
函数定义:public bool CompareTag(string tag)
函数参数:
1.tag:要比较的标签
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if(other.gameObject.CompareTag("Player"))
        {
            Destroy(other.gameObject);
        }
    }
}
Component.GetComponent:如果游戏对象附加了一个此类型的组件,则返回Type类型的组件,如果没有,则返回null。
函数定义:
public Component GetComponent(Type type);
public T GetComponent<T>();
public Component GetComponent(string type)
函数参数:
1.type:要检索的组件类型
代码示例1:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        HingeJoint hinge = GetComponent<HingeJoint>();
        hinge.useSpring = false;
    }
}
代码示例2:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        HingeJoint hinge = GetComponent("HingeJoint") as HingeJoint;
        hinge.useSpring = false;
    }
}
Component.GetComponentInChildren:使用深度优先搜索返回GameObject或其任何子节点中Type类型的组件。仅当在激活的GameObject上找到组件时才返回该组件。
函数定义:
1.public Component GetComponentInChildren(Type t)
2.public T GetComponent<T>();
函数参数:
1.t:要检索的Component的类型
函数返回值:
1.Component:匹配类型的组件(如果找到)。
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        HingeJoint hinge = GetComponentInChildren<HingeJoint>();
        hinge.useSpring = false;
    }
}
Component.GetComponentInParent:返回GameObject或其任何父项中的Type类型的组件。向上递归,直到找到有效的组件。如果未找到组件,则返回null。仅返回激活的GameObject上的组件。
函数定义:
public Component GetComponentInParent(Type t)
public T GetComponentInParent<T>();
函数参数:
1.t:要检索的Component类型
函数返回值:
1.Component:匹配类型的组件(如果找到)。
Component.GetComponents:返回GameObject中Type类型的所有组件。
函数定义:
public Component[] GetComponent(Type type)
public T[] GetComponents<T>();
函数参数:
1.type:要检索的Component类型
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        HingeJoint[] hinges = GetComponents<HingeJoint>();
        int length = hinges.Length;
        for(int i = 0; i < hinges.Length; i++)
        {
            hinges[i].useSpring = false;
        }
    }
}
Component.GetComponentsInChildren:返回GameObject或其任何子项中Type类型的所有组件。
函数定义:
public Component[] GetComponentsInChildren(Type t, bool includeInactive);
public T[] GetComponentsInChildren(bool includeInactive);
public T[] GetComponentsInChildren();
函数参数:
1.t:要检索的Component类型
2.includeInactive:非活动GameObject上的组件是否应包含在找到的集合中?includeInactive决定将搜索GameObject的哪些子节点。无论如何,始终搜索你调用GetComponentsInChildren的GameObject.
函数返回值:
1.Component:匹配类型的组件(如果找到的话)
代码示例
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    public Component[] hingeJoints;
    private void Start()
    {
        hingeJoints = GetComponentsInChildren<HingeJoint>();
        foreach (HingeJoint joint in hingeJoints)
            joint.useSpring = false;
    }
}
Component.GetComponentsInParent:返回GameObject或其任何父项中Type类型的所有组件。
函数定义:
public Component[] GetComponentsInParent(Type t,bool includeInactive = false);
public T[] GetComponentsInParent(bool includeInactive);
public T[] GetComponentsInParent();
函数参数:
1.t:要检索的Component类型
2.includeInactive:非活动GameObject上的组件是否应包含在找到的集合中?
Component.SendMessage:在此游戏对象中的每个MonoBehaviour上调用名为methodName的方法。接收方法可以选择通过零参数来忽略参数。如果将选项设置为SendMessageOptions.RequireReceiver,则在任何组件未拾取消息时将打印错误。注意:消息不会发送到非活动对象(记载编辑器或使用GameObject.SetActive函数停用的对象)
函数定义:
public void SendMessage(string methodName);
public void SendMessage(string methodName,object value);
public void SendMessage(string methodName,object value,SendMessageOptions options);
public void SendMessage(string methodName,SendMessageOptions options);
函数参数
methodName:调用的方法名称
value:方法的可选参数
options:如果目标对象没有实现消息的方法,是否应该引发错误?
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        SendMessage("ApplyDamage", 5.0);
    }
    void ApplyDamage(float damage)
    {
    	//附加到游戏对象的每个脚本都将调用ApplyDamage函数
        print(damage);
    }
}
Component.SendMessageUpwards:在此游戏对象中的每个MonoBehaviour以及脚本的每个父节点上调用名为methodName的方法。接收方法可以选择通过零参数来忽略参数。如果将选项设置为SendMessageOptions.RequireReceiver,则在任何组件未拾取消息时将打印错误。注意:消息不会发送到非活动对象(记载编辑器或使用GameObject.SetActive函数停用的对象)
函数定义:
public void SendMessageUpwards(string methodName,SendMessageOptions options);
public void SendMessageUpwards(string methodName,object value = null,SendMessageOptions options = SendMessageOptions.RequireReceiver);
函数参数:
methodName:调用的函数名称
value:方法的可选参数
options:如果目标对象上不存在该方法方法,是否应该引发错误?
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        SendMessageUpwards("ApplyDamage", 5.0);
    }
    void ApplyDamage(float damage)
    {
        //附加到此游戏对象和任何父节点的每个脚本都将调用ApplyDamage函数
        print(damage);
    }
}
Object.GetInstanceID:返回对象的实例ID。始终保证对象的实例ID是唯一的。
函数定义:public int GetInstanceID();
代码实现:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void Awake()
    {
        for(int i = 0; i < 10; i++)
        {
            GameObject g = new GameObject("abc" + i.ToString("D3"));
        }
    }
    private void Start()
    {
        Object[] allObjects = Object.FindObjectsOfType<GameObject>();
        foreach(GameObject go in allObjects)
        {
            Debug.Log(go + " is an active object " + go.GetInstanceID());
        }
    }
}
Object.ToString:返回GameObject的名称
函数定义:public string ToString();
函数返回值:
string:ToString返回的名称
代码示例:
using UnityEngine;
using UnityEngine.UI;

public class AnimationStateForEach:MonoBehaviour
{
    public Text m_Text;
    private void Start()
    {
        if(m_Text != null)
        {
            m_Text.text = "GameObject Name : " + gameObject.ToString();
        }
    }
}

(3).Static Methods

Object.Destroy:删除GameObject、Component或者asset。对象obj现在或者从现在开始t秒指定时间将被销毁。如果obj是一个Component,它将从GameObject中删除该组件并将其销毁。如果obj是GameObject,它将破坏GameObject,他将销毁GameObject,GameObject的所有组件以及所有transform子对象。实际对象销毁始终延迟到当前Update循环之后,但始终在渲染之前完成。
Destroy继承自UnityEngine.Object基类。Javascript用户应该考虑调用UnityEngine.Object.Destroy,而不是Object.Destroy,以避免将引用解析为.Net System.Object类。
函数定义:public static void Destroy(Object obj,float t = 0.0F)
函数参数:
1.obj:要销毁的对象
2.t:在销毁对象之前可选的延迟时间
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    void DestroyGameObject()
    {
        Destroy(gameObject);
    }
    void DestroyScriptInstance()
    {
        Destroy(this);
    }
    void DestroyComponent()
    {
        Destroy(GetComponent<Rigidbody>());
    }
    void DestroyObjectDelayed()
    {
        Destroy(gameObject, 5);
    }
    private void Update()
    {
        if(Input.GetButton("Fire1") && GetComponent<BoxCollider>())
        {
            Destroy(GetComponent<BoxCollider>());
        }
    }
}
Object.DestroyImmediate:立即销毁对象obj。强烈建议你使用Destroy。只应在编写编辑器代码时使用此函数,因为在编辑模式下永远不会调用延迟销毁。在游戏代码中,你应该使用Object.Destroy。Destroy总是被延迟(但在同一帧内执行)。小新使用此功能,因为它可以永久的破坏asset !注意,永远不要在遍历数组的时候销毁正在迭代的元素,这将导致严重的问题(作为一般编程实践,而不仅仅是在Unity中)。
函数定义:public static void DestroyImmediate(Object obj,bool allowDestroyingAssets = false);
函数参数:
obj:要被销毁的对象
allowDestroyingAssets:设置为true以允许销毁assets
Object.DontDestroyOnLoad:加载新场景时,请勿销毁目标对象。新场景的加载会破坏所有当前场景对象。调用Object.DontDestroyOnLoad以在场景加载期间保留Object.如果目标Object是组件或GameObject,Unity还将保留所有Transform的子项。Object.DontDestroyOnLoad不返回值。使用typeof运算符更改参数类型。
函数定义:public static void DontDestroyOnLoad(Object target)
函数参数:
target:在场景更改时不销毁的对象
代码示例:以下示例脚本使用Object.DontDestroyOnLoad。该示例具有scene1,它开始播放来自AudioSource的背景音乐。当scene2加载时,音乐继续。使用按钮在场景之间切换。要实现此示例,请创建两个名为scene1和scene2的新场景。打开scene1并将SceneSwap.cs脚本添加到空GameObject并将其命名为Menu。接下来,将DontDestroy.cs添加到新的GameObject并将其命名为BackgroundMusic。将AudioSource添加到BackgroundMusic:Add Component->Audio->Audio Source,并将Audio Source导入到项目中。将AudioClip分配给AudioSource的AudioClip字段。创建一个名为music的标签,然后将其添加到BackgroundMusic。切换到scene2。再次将SceneSwap.cs添加到新的GameObject并将其命名为Menu.保存项目。返回scene1并从编辑器运行Project。
SceneSwap.cs script:
using UnityEngine;
using UnityEngine.SceneManagement;

public class AnimationStateForEach:MonoBehaviour
{
    private void OnGUI()
    {
        int xCenter = (Screen.width / 2);
        int yCenter = (Screen.height / 2);
        int width = 400;
        int height = 120;
        GUIStyle fontSize = new GUIStyle(GUI.skin.GetStyle("button"));
        fontSize.fontSize = 32;
        Scene scene = SceneManager.GetActiveScene();
        if(scene.name == "scene1")
        {
            if(GUI.Button(new Rect(xCenter - width/2,yCenter - height/2,width,height),"Load second scene", fontSize))
            {
                SceneManager.LoadScene("scene2");
            }
        }
        else
        {
            if(GUI.Button(new Rect(xCenter - width/2,yCenter - height/2,width,height),"Return to first scene", fontSize))
            {
                SceneManager.LoadScene("scene1");
            }
        }
    }
}

DontDestroy.cs script:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void Awake()
    {
        GameObject[] objs = GameObject.FindGameObjectsWithTag("music");
        if(objs.Length > 1)
        {
            Destroy(this.gameObject);
        }
        DontDestroyOnLoad(this.gameObject);
    }
}
Object.FindObjectOfType:返回Type类型的第一个激活的加载对象。不返回Assets(meshes,textures,prefabs,..)或者非活动对象。它用于定位GameObject且不会返回具有HideFlags.DontSave设置的Object。此方法调用Object.FindObjectOfType并返回与该类型匹配的对象,如果没有对象与该类型匹配,则返回null。注意:此功能非常慢。不建议每帧使用此功能。在大多数情况下,你可以使用单例模式。
函数定义:
public static Object FindObjectOfType(Type type)
函数参数:
type:要查找的对象类型。
函数返回值:
Object:这将返回与指定类型匹配的Object。如果没有Object与类型匹配,则返回null。
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        GUITexture texture = (GUITexture)FindObjectOfType(typeof(GUITexture));
        if (texture)
            Debug.Log("GUITexture object found : " + texture.name);
        else
            Debug.Log("No GUITexture object could be found");
    }
}
Object.FindObjectsOfType:返回Type类型的所有激活的已加载对象的列表。不返回Assets(meshes,textures,prefabs,..)或者非活动对象。不会返回具有HideFlags.DontSave设置的对象。使用Resources.FindObjectsOfTypeAll可以避免这些限制。注意:此功能非常慢。不建议每帧使用此功能。在大多数情况下,你可以使用单例模式。
函数定义:
public static Object[] FindObjectOfType(Type type)
函数参数:
type:要查找的对象类型
函数返回值:
Object[]:找到与指定类型匹配的对象数组。
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private const int count = 10;
    private void Start()
    {
        var gameObjects = new GameObject[count];
        var expectedObjects = new TextMesh[count];
        for(var i = 0; i < count; ++i)
        {
            gameObjects[i] = new GameObject();
            expectedObjects[i] = gameObjects[i].AddComponent<TextMesh>();
        }
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            var foundObjects = FindObjectsOfType<TextMesh>();
            Debug.Log(foundObjects + ":" + foundObjects.Length);
        }
    }
}
Object.Instantiate:克隆原始对象,并返回克隆的对象。此函数以与编辑器中的"Duplicate"命令类似的方式创建对象的副本。如果你正在克隆GameObject,那么你也可以选择指定其position和rotation(否则默认为原始GameObject的position和rotation)。如果你正在克隆一个Component,那么它附加的GameObject也将被克隆,再次使用可选的position和rotation。克隆Gameobject或Component时,所有子对象和组件也将被克隆,其属性设置与原始对象的属性相同。默认情况下,新对象的父节点将为null,因此它不会是原始对象的"sibling"。但是,你仍然可以使用重载方法设置父节点。如果指定了父节点并且未指定poisiton和rotation,则如果instantiateInWorldSpace参数为true,则原始position和rotation将用于克隆对象的本地position和rotation,或其世界position和rotation。如果指定了position和rotation,他们将用作对象在世界空间中position和rotation。克隆时GameObject的激活状态将被传递,因此如果原始文件处于非激活状态,则克隆物体也将在非激活状态下创建。
函数定义:
public static Object Instantiate(Object original);
public static Object Instantiate(Object original,Transform parent);
public static Object Instantiate(Object original,Transform parent,bool instantiateInWorldSpace);
public static Object Instantiate(Object original,Vector3 position,Quaternion rotation);
public static Object Instantiate(Object original,Vector3 position,Quaternion rotation,Transform parent)
public static T Instantiate(T original);
public static T Instantiate(T original, Transform parent);
public static T Instantiate(T original, Transform parent,bool worldPositionStays);
public static T Instantiate(T original,Vector3 position,Quaternion rotation);
public static T Instantiate(T original,Vector3 position,Quaternion rotation,Transform parent);
函数参数:
original:要复制的现有对象
position:新对象的position
rotation:新对象的方向
parent:分配给新对象的父节点
instantiateInWorldSpace:在指定父节点且保持Object的世界坐标时传递true,若相对于父节点设置其位置则传递false。
函数返回值:
Object:实例化的克隆对象
T:T类型对象
代码示例1:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    public Transform prefab;
    private void Start()
    {
        if(!prefab.Equals(this.transform))
        {
            for (int i = 0; i < 10; i++)
            {
                Instantiate(prefab, new Vector3(i * 2.0f, 0, 0), Quaternion.identity);
            }
        }
    }
}
代码示例2:Instantiate最常用于实例化子弹、AI敌人、粒子爆炸或物体替换
using UnityEngine;
public class AnimationStateForEach:MonoBehaviour
{
    Rigidbody projectile;
    private void Update()
    {
        if(Input.GetButtonDown("Firel"))
        {
            Rigidbody clone;
            clone = Instantiate(projectile, transform.position, transform.rotation);
            clone.velocity = transform.TransformDirection(Vector3.forward * 10);
        }
    }
}
代码示例3:Instantiate也可以直接克隆脚本实例。将克隆的整个GameObject的hierarchy结构,并返回克隆的脚本实例。
using UnityEngine;

public class Missile : MonoBehaviour
{
    public int timeoutDestructor;
}
public class AnimationStateForEach:MonoBehaviour
{
    public Missile projectile;
    private void Update()
    {
        if(Input.GetButtonDown("Firel"))
        {
            Missile clone = (Missile)Instantiate(projectile, transform.position, transform.rotation);
            clone.timeoutDestructor = 5;
        }
    }
}
代码示例4:
using UnityEngine;

public class Missile : MonoBehaviour
{
}
public class AnimationStateForEach:MonoBehaviour
{
    public Missile missile;
    private void Update()
    {
        Missile clone = Instantiate<Missile>(missile);
    }
}

(4).Operators

Object.bool:对象是否存在
函数定义:Object.bool
代码示例1:
using UnityEngine;
public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        if(GetComponent<Rigidbody>())
        {
            Debug.Log("Rigidbody attached to this transform");
        }
    }
}
等价于:
using UnityEngine;
public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        if(GetComponent<Rigidbody>() != null)
        {
            Debug.Log("Rigidbody attached to this transform");
        }
    }
}
Object.operator !=:比较两个对象是否引用不同的对象
函数定义:public static bool operator !=(Object x, Object y);
代码示例:
using UnityEngine;
public class AnimationStateForEach:MonoBehaviour
{
    Transform target;
    private void Update()
    {
        if(target != transform)
        {
            print("Another object");
        }
    }
}
Object.operator ==:比较两个对象引用以查看它们是否引用同一对象。
函数定义:public static bool operator ==(Object x,Object y);
函数参数:
x:第一个对象
y:要与第一个对象进行比较的对象。
代码示例1:
using UnityEngine;
public class AnimationStateForEach:MonoBehaviour
{
    public Collider target;
    private void OnTriggerEnter(Collider other)
    {
        if(other == target)
        {
            print("We hit the target trigger");
        }
    }
}
代码示例2:判断是否为空
using UnityEngine;
public class AnimationStateForEach:MonoBehaviour
{
    public Transform target;
    private void Update()
    {
        if(target == null)
        {
            return;
        }
    }
}
代码示例3:实例化GameObject会将其添加到场景中,以便完全初始化(!destroyed)。实例化一个简单的UnityEngine.Object没有这样的语义,所以它保持在destroyed状态,与null比较为true。
using UnityEngine;
public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        GameObject go = new GameObject();
        Debug.Log(go == null);
        Object obj = new Object();
        Debug.Log(obj == null);
    }

二、WrapMode
1.描述
  确定如何处理AnimationClip货AnimationCurve的关键帧范围之外的时间。
  Animation系统用于特定动画的WrapMode以这种方式确定:
  你可以在剪辑的导入设置中设置AnimationClip的WrapMode。这是控制WrapMode的推荐方法。当创建一个AnimationState时,它从它创建的AnimationClip继承其WrapMode,但你也可以从代码中更改它。如果AnimationState的WrapMode设置为Default,则Animation系统将使用Animation组件中的WrapMode.
2.Properties

Once:当时间到达动画片段的末尾时,片段将自动停止播放,时间将重置为片段的开头。注意:当向后播放时,当时间到达开头时,剪辑将自动停止播放,但时间不会重置到结尾,它将保留在开头。
函数定义:WrapMode.Once
Loop:当时间到达动画片段的末尾时,时间将在开始时继续。向后播放时它会反过来,它会跳到剪辑的末尾并从那里继续。动画永远不会自动停止播放。
函数定义:WrapMode.Loop
PingPong:当时间到达动画片段的末尾时,时间将在开始和结束之间回拨。向后播放时它具有相同的行为,当时间到达Animation Clip的开头时,时间将在开始和结束之间回拨。动画永远不会自动停止播放。
函数定义:WrapMode.PingPong
Default:读取更高层(Animation Clip或Animation)的设置。如果你尚未在Animation Clip或Animation上更改WrapMode,则WrapMode.Default将解析为WrapMode.Once
函数定义:WrapMode.Default
ClampForever:播放动画。当它到达终点时,它将继续播放最后一帧并且永不停止播放。向后播放时,它将到达第一帧并继续播放。这对于添加动画是很有用的,当它们达到最大值时不应该停止。
函数定义:WrapMode.ClampForever

三、PlayMode

1.描述
  由Animation.Play函数使用

2.属性

StopSameLayer:将停止在同一layer中启动的所有动画。这是播放动画时的默认设置。
函数定义:PlayMode.StopSameLayer
StopAll:在播放之前,将停止使用此组件启动的所有动画。
函数定义:PlayMode.StopAll

四、QueueMode
1.描述
  被Animation.Play函数使用
2.属性

CompleteOthers:在所有其他动画停止播放后将开始播放。
函数定义:QueueMode.CompleteOthers
PlayNow:立即开始播放。如果你只是想快速创建重复动画,则可以使用此选项。
函数定义:QueueMode.PlayNow

五、HideFlags
1.描述
  位掩码,用于控制Inspectors中的对象销毁、保存和可见性。

using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private Material ownedMaterial;
    private void OnEnable()
    {
        ownedMaterial = new Material(Shader.Find("Diffuse"));
        ownedMaterial.hideFlags = HideFlags.HideAndDontSave;
        GetComponent<Renderer>().sharedMaterial = ownedMaterial;
    }
    private void OnDisable()
    {
        DestroyImmediate(ownedMaterial);
    }
}

2.Properties

None:一个普通的可见物体。这是默认值。
函数定义:HideFlags.None
HideInHierarchy:该对象不会出现在hierarchy中。
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        for(int i = 0; i < 5; i++)
        {
            GameObject createdG0 = GameObject.CreatePrimitive(PrimitiveType.Plane);
            createdG0.hideFlags = HideFlags.HideInHierarchy;
        }
    }
}
HideInInspector:无法在Inspector中查看它
函数定义:HideFlags.HideInInspector
DontSaveInEditor:该对象不会在编辑器中保存到场景中。你必须使用DestroyImmediate从内存中手动清除对象以避免内存泄漏。
函数定义:HideFlags.DontSaveInEditor
NotEditable:inspector中无法编辑该对象。
函数定义:HideFlags.NotEditable
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        GameObject createdGO = GameObject.CreatePrimitive(PrimitiveType.Plane);
        createdGO.hideFlags = HideFlags.NotEditable;
    }
}
DontSaveInBuild:构建播放器时不会保存该对象。你必须使用DestroyImmediate从内存中手动清除对象以避免内存泄漏。
函数定义:HideFlags.DontSaveInBuild
DontUnloadUnusedAsset:Resources.UnloadUnusedAssets不会卸载该对象。你必须使用DestroyImmediate从内存中手动清除对象以避免内存泄漏。
函数定义:HideFlags.DontUnloadUnusedAsset
DontSave:该对象不会保存到场景中。加载新场景时不会销毁它。它是HideFlags.DontSaveInBuild|HideFlags.DontSaveInEditor|HideFlags.DontUnloadUnusedAsset的快捷方式。你必须使用DestroyImmediate从内存中手动清除对象以避免内存泄漏。
函数定义:HideFlags.DontSave
HideAndDontSave:GameObject不会显示在Hierarchy中,也不会保存到场景中,也不会被Resources.UnloadUnusedAssets卸载。这最常用于由脚本创建的游戏对象,并且完全在脚本的控制之下。
函数定义:HideFlags.HideAndDontSave
代码示例:
using UnityEngine;

public class AnimationStateForEach:MonoBehaviour
{
    private Material ownedMaterial;
    private void OnEnable()
    {
        ownedMaterial = new Material(Shader.Find("Diffuse"));
        ownedMaterial.hideFlags = HideFlags.HideAndDontSave;
        GetComponent<Renderer>().sharedMaterial = ownedMaterial;
    }
    private void OnDisable()
    {
        DestroyImmediate(ownedMaterial);
    }
}

六、SendMessageOptions
1.描述
  如何发送消息的选项。这由GameObject和Component中的SendMessage和BroadcastMessage使用
2.属性

RequireReceiver:SendMessage需要接收器。如果未找到接收器,则会向控制台输出错误
函数定义:SendMessageOptions.RequireReceiver
DontRequireReceiver:SendMessage不需要接收器。如果GameObject上没有组件(脚本)实现该方法,则不会生成错误。

七、Animation Clip
1.描述
  存储基于keyframe的动画。AnimationClip由Animation用于播放动画。
2.属性

empty:如果动画片段没有曲线且没有事件,则返回true
函数定义:public bool empty;
event:此Animation Clip的动画事件。修改的事件仅持续在运行模式直到玩家退出。如果你想持久添加动画事件,在编辑器使用AnimationUtility.SetAnimationEvents。
函数定义:public AnimationEvent[] events;
frameRate:keyframes采样的帧速率。(只读)。帧速率是在动画程序用于创建动画或模型中使用。动画采样的时候是根据当前播放的时间去找对应的前后两个关键帧做插值。所以动画本身得告诉Unity两个关键帧(没做keyframe reduction时)的间隔时间是多少,或者一秒有多少帧,这个值就是framerate。所以这个是只读的,导出时就应该是确定的。因此这个值也不会影响运行时动画的更新次数,默认情况下动画就是每帧更新一次。
函数定义:public float frameRate;
代码示例:
using UnityEngine;
public class AnimationStateForEach:MonoBehaviour
{
    public Animation anim;
    private void Start()
    {
        print(anim["PlayableAnim1"].clip.frameRate);
    }
}
输出结果:60
hasGenericRootTransform:如果动画在root transform上有动画,则返回true.
函数定义:public bool hasGenericRootTransform
hasMotionCurves:如果AnimationClip具有root motion curves曲线,则返回true
函数定义:public bool hasMotionCurves;
hasMotionFloatCurves:如果AnimationClip具有root motion的编辑器曲线,则返回true。
函数定义:public bool hasMotionFloatCurves;
hasRootCurves:如果AnimationClip具有root Curves,则返回true。
函数定义:public bool hasRootCurves;
humanMotion:如果动画包含驱动humanoid rig的曲线,则返回true.
函数定义:
public bool humanMotion;
legacy:如果AnimationClip将与Legacy Animation组件(而不是Animator)一起使用,则设置为true。
函数定义:public bool legacy;
代码示例:
using UnityEngine;
public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        AnimationClip fovc = new AnimationClip();
        AnimationCurve curve = AnimationCurve.Linear(0.0f, 60.0f, 10.0f, 90.0f);
        fovc.SetCurve("", typeof(Camera), "field of view", curve);
        fovc.legacy = true;
        GetComponent<Animation>().AddClip(fovc, "animfov");
        GetComponent<Animation>().Play("animfov");
    }
}
length:动画长度以秒为单位。(只读)
函数定义:public float length
localBound:Animation Clip的AABB在它附加的Animation组件的局部空间中。它是在导入时根据此Animation Clip影响的网格导入的模型/动画进行预先计算的。此边界框特定于导入期间此剪辑附加到的网格,即这意味着它是基于"Model"文件的一部分计算的,如果你使用的是Model@Animation符号。
函数定义:public Bounds localBounds;
wrapMode:设置animation state中使用的default wrap模式。仅用于Legacy AnimationClip
函数定义:public WrapMode wrapMode;

3.Constructors

AnimationClip:创建一个新的animation clip
函数定义:public AnimationClip();

4.Public Methods

AddEvent:向剪辑添加动画事件。注意:添加的事件仅持续在运行模式直到玩家退出。如果你想持久添加动画事件,在编辑器使用AnimationUtility.SetAnimationEvents。
函数定义:
public void AddEvent(AnimationEvent evt)
函数参数:
evt:添加的AnimationEvent
ClearCurves:删除剪辑的所有曲线
函数定义:public void ClearCurves();
EnsureQuaternionContinuity:重新对齐四元数键以确保最短的插值路径。调用此函数是为了确保更好的插入四元数。应在设置动画曲线后调用它。
函数定义:public void EnsureQuaternionContinuity();
SampleAnimation:在给定时间为任何动画属性采样动画。出于性能的原因,建议使用Animation接口。这将在给定时间对动画进行采样。在剪辑中动画的任何组件属性都将替换Wie采样值。大多数时候你可以使用Animation.Play替换。当你需要以无序方式或基于某些特殊输入在帧之间跳转时,SampleAnimation非常有用。(动画预览)
函数定义:public void SampleAnimation(GameObject go,float time);
函数参数:
go:制作动画的GameObject
time:采样动画的时间
SetCurve:指定曲线以设置特定属性的动画。如果curve为空,则删除曲线。如果该属性已存在曲线,则将替换该曲线。注意:SetCurve仅在运行时用于legacy animation clips。对于非传统的Animation Clip,它是一个仅限编辑器的功能。
函数定义:public void SetCurve(string relativePath,Type type,string propertyName,AnimationCurve curve);
函数参数:
relativePath:此曲线适用的游戏对象的路径。relativePath的格式类似于路径名,例如:"root/spine/leftArm".如果relativePath为空,则表示animation clip附加到的游戏对象。
type:设置动画的组件的类类型
propertyName:要设置动画的属性的名称或路径
curve:动画曲线
代码示例:显示如何使用animation clip为GameObject position设置动画。使用SetCurve()将动画曲线设置到AnimationClip上。此示例将x偏移从1.0向下移动到0.0.SetCurve API可用于为各种参数设置动画。一些典型的组件,如Transform和Material很容易访问变量。例如:Transform.localPosition,可以使用Animation API对localPostion的x,y和z值进行动画处理。查看Transform文档以查看变量以及如何设置动画。Material类还链接到可以设置动画的变量。这些来自用于渲染的着色器。使用材质下拉列表中的"Edit Shader..."选项可显示可以设置动画的所有参数。动画参数都以下划线开头。例如可以为颜色(_Color)和缩放(_BumpScale)设置动画。要在同一渲染器上索引多个材质,你可以为此属性添加前缀,如下所示:[1]._MainTex.offset.y。下面的实例脚本显示了如何以两种方式同时为GameObject制作动画。在此示例中,为GameObject的position设置动画,同时材质颜色也随时间变化。
using UnityEngine;
public class AnimationStateForEach:MonoBehaviour
{
    private void Start()
    {
        Animation anim = GetComponent<Animation>();
        AnimationCurve curve;
        AnimationClip clip = new AnimationClip();
        clip.legacy = true;
        Keyframe[] keys;
        keys = new Keyframe[3];
        keys[0] = new Keyframe(0.0f, 0.0f);
        keys[1] = new Keyframe(1.0f, 1.5f);
        keys[2] = new Keyframe(2.0f, 0.0f);
        curve = new AnimationCurve(keys);
        clip.SetCurve("", typeof(Transform), "localPostion.x", curve);
        curve = AnimationCurve.Linear(0.0f, 1.0f, 2.0f, 0.0f);
        clip.SetCurve("", typeof(Material), "_Color.r", curve);
        anim.AddClip(clip, clip.name);
        anim.Play(clip.name);
    }
}
通过在Editor settings中将Asset Serialization设置为Force Text模式,可以找到属性名称。使用Editor->Project Setting->Editor启用此模式。然后由编辑器写入的文本文件将包含属性的名称。例如,为Scene对象编写的yaml文件将包含Camera设置。以下是这个yaml文件显示的内容:
m_BackGroundColor: {r: .192156866, g: .301960796, b: .474509805, a: .0196078438}
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: .300000012
far clip plane: 1000
field of view: 60
orthographic: 0
orthographic size: 5
m_Depth: -1
这表明FOV参数的名称是"field of view"。如果要创建animation clip以设置摄像机field of view的动画,则可以将field of view作为propertyName传递。另一个例子是Light设置的访问。scene.unity文件(假设一个名为scene的场景)将有一个light color的字符串。脚本可以通过访问m_Color来访问light color.场景中需要有一个灯才能使这个例子起作用。

5.Inherited Members
(1).Properties

Object.hideFlags:隐藏对象,使用场景保存还是用户可修改。
函数定义:public HideFlags hideFlags;
Object.name:对象的名称。组件与游戏对象和所有附加组件共享相同的名称。如果一个类派生自MonoBehaviour,它将从MonoBehaviour继承"name"字段。如果此类也附加到GameObject,则"name"字段将设置为GameObject的名称。

(2).Public Methods

Object.GetInstanceID:返回对象的实例ID。始终保证对象的实例ID是唯一的。
Object.ToString:返回GameObject的名称

(3).Static Methods

Object.Destroy:删除GameObject、Component或者asset。对象obj现在或者从现在开始t秒指定时间将被销毁。如果obj是一个Component,它将从GameObject中删除该组件并将其销毁。如果obj是GameObject,它将破坏GameObject,他将销毁GameObject,GameObject的所有组件以及所有transform子对象。实际对象销毁始终延迟到当前Update循环之后,但始终在渲染之前完成。
Destroy继承自UnityEngine.Object基类。Javascript用户应该考虑调用UnityEngine.Object.Destroy,而不是Object.Destroy,以避免将引用解析为.Net System.Object类。
Object.DestroyImmediate:立即销毁对象obj。强烈建议你使用Destroy。只应在编写编辑器代码时使用此函数,因为在编辑模式下永远不会调用延迟销毁。在游戏代码中,你应该使用Object.Destroy。Destroy总是被延迟(但在同一帧内执行)。小新使用此功能,因为它可以永久的破坏asset !注意,永远不要在遍历数组的时候销毁正在迭代的元素,这将导致严重的问题(作为一般编程实践,而不仅仅是在Unity中)。
Object.DontDestroyOnLoad:加载新场景时,请勿销毁目标对象。新场景的加载会破坏所有当前场景对象。调用Object.DontDestroyOnLoad以在场景加载期间保留Object.如果目标Object是组件或GameObject,Unity还将保留所有Transform的子项。Object.DontDestroyOnLoad不返回值。使用typeof运算符更改参数类型。
Object.FindObjectOfType:返回Type类型的第一个激活的加载对象。不返回Assets(meshes,textures,prefabs,..)或者非活动对象。它用于定位GameObject且不会返回具有HideFlags.DontSave设置的Object。此方法调用Object.FindObjectOfType并返回与该类型匹配的对象,如果没有对象与该类型匹配,则返回null。注意:此功能非常慢。不建议每帧使用此功能。在大多数情况下,你可以使用单例模式。
Object.FindObjectsOfType:返回Type类型的所有激活的已加载对象的列表。不返回Assets(meshes,textures,prefabs,..)或者非活动对象。不会返回具有HideFlags.DontSave设置的对象。使用Resources.FindObjectsOfTypeAll可以避免这些限制。注意:此功能非常慢。不建议每帧使用此功能。在大多数情况下,你可以使用单例模式。
Object.Instantiate:克隆原始对象,并返回克隆的对象。此函数以与编辑器中的"Duplicate"命令类似的方式创建对象的副本。如果你正在克隆GameObject,那么你也可以选择指定其position和rotation(否则默认为原始GameObject的position和rotation)。如果你正在克隆一个Component,那么它附加的GameObject也将被克隆,再次使用可选的position和rotation。克隆Gameobject或Component时,所有子对象和组件也将被克隆,其属性设置与原始对象的属性相同。默认情况下,新对象的父节点将为null,因此它不会是原始对象的"sibling"。但是,你仍然可以使用重载方法设置父节点。如果指定了父节点并且未指定poisiton和rotation,则如果instantiateInWorldSpace参数为true,则原始position和rotation将用于克隆对象的本地position和rotation,或其世界position和rotation。如果指定了position和rotation,他们将用作对象在世界空间中position和rotation。克隆时GameObject的激活状态将被传递,因此如果原始文件处于非激活状态,则克隆物体也将在非激活状态下创建。

(4).Operators

Object.bool:对象是否存在
Object.operator !=:比较两个对象是否引用不同的对象
Object.operator ==:比较两个对象引用以查看它们是否引用同一对象。

八、AnimationCurve
1.描述
  存储可以随时间评估的关键帧集合。
2.Properties

keys:动画曲线中定义的所有key。这使你可以清除、添加或删除array中的任何key。如果key未按时间排序,它们将在分配时自动排序。注意:数组是"by value",即获取keys并返回所有key的副本,设置key将它们复制到曲线中。
函数定义:public keyframe[] keys;
length:曲线中的key的数量。(只读)
函数定义:public int length;
postWrapMode:最后一个关键帧后动画的行为
函数定义:public WrapMode postWrapMode;
preWrapMode:第一个关键帧之前动画的行为。
函数定义:public WrapMode preWrapMode.
this[int]:检索索引处的键。(只读)
函数定义:public Keyframe this[int];

3.Constructor

AnimationCurve:通过任意数量的keyframes创建动画曲线。如果要从keyframes数组创建曲线,可以创建一个空的曲线并指定keys属性。
函数定义:
public AnimationCurve(params keyframe[] keys);
public AnimationCurve():创建一个空的动画曲线
函数参数:
keys:用于定义曲线的keyframe数组
代码示例:
using UnityEngine;
public class AnimationStateForEach:MonoBehaviour
{
    public AnimationCurve curve;
    private void Start()
    {
        curve = new AnimationCurve(new Keyframe(0, 0), new Keyframe(1, 1));
        curve.preWrapMode = WrapMode.PingPong;
        curve.postWrapMode = WrapMode.PingPong;
    }
    private void Update()
    {
        transform.position = new Vector3(transform.position.x, curve.Evaluate(Time.time), transform.position.z);
    }
}

4.Public Methods

AddKey:向曲线添加新key
函数定义:
public int AddKey(float time,float value):为键自动计算平滑切线。返回添加的key的索引。如果没有key可以添加,可能是同时已经有另一个keyframe,此时将返回-1.
public int AddKey(Keyframe key):返回添加的key的索引。如果没有key可以添加,可能是同时已经有另一个keyframe,此时将返回-1.
函数参数:
time:添加key的时间(曲线图中的水平轴)
value:key的值(曲线图中的垂直轴)
key:添加到曲线的key
函数返回值:
int:添加的key的索引,如果无法添加key,则返回-1
Evaluate:当前时间的值
函数定义:public float Evaluate(float time)
函数参数:
time:曲线中要取值的时间点(曲线图中的水平轴)
函数返回值:
float:指定时间点的曲线值。
MoveKey:删除索引处的keyframe并插入key。如果key.time已存在关键帧,即将使用旧关键帧的位置键[index].time的时间。这是在曲线编辑器删除keyframe所需的行为。删除后返回keyframe的索引。
函数定义:public int MoveKey(int index,Keyframe key)
函数参数:
index:要删除的key的索引
key:要除插入的key(带有时间)
函数返回值:
int:删除后keyframe的索引
RemoveKey:删除key
函数定义:public void RemoveKey(int index)
函数参数:
index:要删除的key的索引
SmoothTangents:平滑keyframe的内切和外切的索引。外切权重为0。
函数定义:public void SmoothTangents(int index,float weight);
函数参数:
index:要平滑的keyframe的索引
weight:应用于keyframe平滑的平滑权重

Static Methods

Constant:从timeStart开始创建一个常量曲线,以timeEnd结束并使用值。
函数定义:public static AnimationCurve Constant(float timeStart,float timeEnd,float value);
函数参数:
timeStart:常量曲线的开始时间
timeEnd:常量曲线的结束事件
value:常量曲线的值
函数返回值:
AnimationCurve:通过指定值创建的常量曲线。
EaseInOut:一个渐入渐出的曲线,开始于timeStart,valueStart,终止于timeEnd,valueEnd
函数定义:
public static AnimationCurve EaseInOut(float timeStart,float valueStart,float timeEnd,float valueEnd);
函数参数:
timeStart:渐入渐出曲线的开始时间
valueStart:渐入渐出曲线的开始值
timeEnd:渐入渐出曲线的结束时间
valueEnd:渐入渐出曲线的结束值
函数返回值:
AnimationCurve:从指定值生成的渐入渐出曲线
Linear:一条直线,开始于timeStart,valueStart,以timeEnd,valueEnd结束。
函数定义:
public static AnimationCurve Linear(float timeStart,float valueStart,float timeEnd,float valueEnd);
函数参数:
timeStart:直线开始的时间
valueStart:直线开始的值
timeEnd:直线结束的时间
valueEnd:直线结束的值
函数返回值:
AnimationCurve:从指定值创建的直线

九、Keyframe
1.描述
  可以注入动画曲线的当个keyframe
2.Properties

inTangent:设置此键的传入切线。入射切线会影响从上一个键到此键的曲线斜率。入射切线与曲线的入射斜率匹配。inTangent的正直导致向下切线,而负值导致向上切线。
函数定义:public float inTangent
代码示例:
using UnityEngine;
public class AnimationStateForEach:MonoBehaviour
{
    AnimationCurve animCurve = null;
    private void Start()
    {
        Keyframe[] ks = new Keyframe[3];
        ks[0] = new Keyframe(0, 0);
        //y轴上为-5个单位,x轴上为1个单位
        ks[0].inTangent = 5f;
        ks[1] = new Keyframe(4, 0);
        //直线
        ks[1].inTangent = 0f;
        ks[2] = new Keyframe(6, 0);
        //y轴上为5个单位,x轴上为1个单位
        ks[2].inTangent = -5f;
        animCurve = new AnimationCurve(ks);
    }
    private void Update()
    {
        if (animCurve != null)
            transform.position = new Vector3(Time.time, animCurve.Evaluate(Time.time), 0);
    }
}
inWeight:设置此键的传入权重。输入的权重会影响从上一个key到此key的曲线斜率。权重是介于0和1之间的值。将weightedMode设置为WeightedMode.In或WeightedMode.Both以计算传入曲线的斜率时包括权重。
函数定义:public float inWeight
代码示例:
using UnityEngine;
public class AnimationStateForEach:MonoBehaviour
{
    AnimationCurve animCurve = null;
    private void Start()
    {
        Keyframe[] ks = new Keyframe[3];
        ks[0] = new Keyframe(0, 0);
        ks[0].weightedMode = WeightedMode.In;
        ks[0].inWeight = 0.5f;
        ks[1] = new Keyframe(4, 0);
        ks[1].weightedMode = WeightedMode.In;
        //权重为0,如果先前的keyframe的outWeight也为0,则该段将是线性的。
        ks[1].inWeight = 0f;
        ks[2] = new Keyframe(6, 0);
        ks[2].weightedMode = WeightedMode.In;
        //1/3是weightedMode中WeightedMode.None的默认权重。
        ks[2].inWeight = 1f / 3f;
        animCurve = new AnimationCurve(ks);
    }
    private void Update()
    {
        if (animCurve != null)
            transform.position = new Vector3(Time.time, animCurve.Evaluate(Time.time), 0);
    }
}
outTangent:设置此key的输出切线。输出切线影响从该键到下一个键的曲线斜率。输出切线匹配曲线的输出斜率。inTangent的正值导致向上切线,而负值导致向下切线。
函数定义:public float outTangent;
代码示例:
using UnityEngine;
public class AnimationStateForEach : MonoBehaviour
{
    AnimationCurve animCurve = null;
    private void Start()
    {
        Keyframe[] ks = new Keyframe[3];
        ks[0] = new Keyframe(0, 0);
        //y轴上为-5个单位,x轴上为1个单位
        ks[0].outTangent = 5f;
        ks[1] = new Keyframe(4, 0);
        //直线
        ks[1].outTangent = 0f;
        ks[2] = new Keyframe(6, 0);
        //y轴上为5个单位,x轴上为1个单位
        ks[2].outTangent = -5f;
        animCurve = new AnimationCurve(ks);
    }
    private void Update()
    {
        if (animCurve != null)
            transform.position = new Vector3(Time.time, animCurve.Evaluate(Time.time), 0);
    }
}
outWeight:设置此key的输出权重。输出权重会影响从此key到下一个key的曲线斜率。权重是介于0和1之间的值。将weightedMode设置为WeightedMode.Out或WeightedMode.Both以在计算输出曲线的斜率时包括权重
函数定义:public float outWeight
代码示例:
using UnityEngine;
public class AnimationStateForEach : MonoBehaviour
{
    AnimationCurve animCurve = null;
    private void Start()
    {
        Keyframe[] ks = new Keyframe[3];
        ks[0] = new Keyframe(0, 0);
        ks[0].weightedMode = WeightedMode.Out;
        ks[0].inWeight = 0.5f;
        ks[1] = new Keyframe(4, 0);
        ks[1].weightedMode = WeightedMode.Out;
        //权重为0,如果先前的keyframe的outWeight也为0,则该段将是线性的。
        ks[1].inWeight = 0f;
        ks[2] = new Keyframe(6, 0);
        ks[2].weightedMode = WeightedMode.Out;
        //1/3是weightedMode中WeightedMode.None的默认权重。
        ks[2].inWeight = 1f / 3f;
        animCurve = new AnimationCurve(ks);
    }
    private void Update()
    {
        if (animCurve != null)
            transform.position = new Vector3(Time.time, animCurve.Evaluate(Time.time), 0);
    }
}
time:keyframe的时间.在2D图形中,你可以将其视为x值。
函数定义:public float time;
代码实现:
using UnityEngine;

public class AnimationStateForEach : MonoBehaviour
{
    private void Start()
    {
        AnimationCurve curve = AnimationCurve.Linear(0, 0, 5, 5);
        //从曲线的第一个关键帧中提取时间
        Debug.Log(curve[0].time);
    }
}
value:keyframe处曲线的值。在2D图形中,你可以将其视为y值
函数定义:public float value;
代码示例:
using UnityEngine;

public class AnimationStateForEach : MonoBehaviour
{
    private void Start()
    {
        AnimationCurve curve = AnimationCurve.Linear(0, 0, 5, 5);
        //从曲线的第一个关键帧中提取值
        Debug.Log(curve[0].value);
    }
}
weightedMode:keyframe的权重模式
函数定义:public WeightedMode weightedMode;

3.Constructors

keyframe:创建一个keyframe
函数定义:
public Keyframe(float time,float value);
public Keyframe(float time,float value,float inTangent,float outTangent);
public Keyfrmae(float time,float value,float inTangent,float outTangent,float inWeight,float outWeight);
代码示例1:
using UnityEngine;

public class AnimationStateForEach : MonoBehaviour
{
	//使GameObject在x轴和y轴上遵循sin函数
    AnimationCurve anim;
    Keyframe[] ks;
    private void Start()
    {
        ks = new Keyframe[50];
        for(var i = 0; i < ks.Length; i++)
        {
            ks[i] = new Keyframe(i, Mathf.Sin(i));
        }
        anim = new AnimationCurve(ks);
    }
    private void Update()
    {
        transform.position = new Vector3(Time.time, anim.Evaluate(Time.time), 0);
    }
}
代码示例2:
using UnityEngine;

public class AnimationStateForEach : MonoBehaviour
{
    //使GameObject在x轴和y轴上遵循sin函数
    AnimationCurve anim;
    Keyframe[] ks;
    private void Start()
    {
        ks = new Keyframe[50];
        for(var i = 0; i < ks.Length; i++)
        {
            ks[i] = new Keyframe(i, Mathf.Sin(i), 90, 90);
        }
        anim = new AnimationCurve(ks);
    }
    private void Update()
    {
        transform.position = new Vector3(Time.time, anim.Evaluate(Time.time), 0);
    }
}
代码示例3:
using UnityEngine;

public class AnimationStateForEach : MonoBehaviour
{
    //使GameObject在x轴和y轴上遵循sin函数
    AnimationCurve anim;
    Keyframe[] ks;
    private void Start()
    {
        ks = new Keyframe[50];
        for(var i = 0; i < ks.Length; i++)
        {
            ks[i] = new Keyframe(i, Mathf.Sin(i), 0, 0, 0, 0);
        }
        anim = new AnimationCurve(ks);
    }
    private void Update()
    {
        transform.position = new Vector3(Time.time, anim.Evaluate(Time.time), 0);
    }
}

十、WeightedMode
1.描述
  设置计算曲线段时要使用的权重
2.Properties

None:在计算曲线段时排除Weight或outWeigh。
函数定义:WeightedMode.None
In:计算前一曲线段时包括inWeight。
函数定义:WeightedMode.In
Out:计算下一个曲线段时包括outWeight。
函数定义:WeightedMode.Out
Both:在计算曲线段时包括inWeight和outWeight
函数定义:WeightedMode.Both

十一、AnimationEvent

1.描述

  AnimationEvent允许你在播放动画时调用类似于SendMessage的脚本函数。

  动画事件支持采用零个或一个参数的函数。参数可以是float、int、string、对象引用或AnimationEvent

  代码示例1:

Unity AVProVideo AudioOutput怎么用 unity animation api_函数定义_03


Unity AVProVideo AudioOutput怎么用 unity animation api_unity_04


Unity AVProVideo AudioOutput怎么用 unity animation api_函数定义_05

using UnityEngine;

public class AnimationEventExample : MonoBehaviour
{
    public void PrintEvent()
    {
        Debug.Log("PrintEvent");
    }
}

代码示例2:下面的示例更详细的显示了创建动画的更复杂的方法。在此脚本示例中,访问Animator组件并从中获取Clip.(此clip已在Animation窗口设置.)clip持续2秒。创建一个AnimationEvent,并设置参数。参数包括将处理时间的函数PrintEvent().然后将事件添加到clip中。这一切都发生在Start()中。一旦游戏启动,事件在1.3s后调用,然后每2s重复一次。

using UnityEngine;

//给附加Animator的GameObject添加Animation Event
public class AnimationEventExample : MonoBehaviour
{
    public void Start()
    {
        //GameObject的现有组件
        AnimationClip clip;
        Animator anim;
        //新创建的事件
        AnimationEvent evt;
        evt = new AnimationEvent();
        //在AnimationEvent上放置一些参数。
        //-调用名为PrintEvent()的函数
        //-此对象上的动画持续2s。此处创建的新AnimationEvent设置为动画中的1.3s
        evt.intParameter = 12345;
        evt.time = 1.3f;
        evt.functionName = "PrintEvent";

        //获取animation clip并添加AnimationEvent
        anim = GetComponent<Animator>();
        clip = anim.runtimeAnimatorController.animationClips[0];
        clip.AddEvent(evt);
    }
    public void PrintEvent(int i)
    {
        print("PrintEvent: " + i + " call at: " + Time.time);
    }
}

2、Properties

animationState:触发此事件的animation state(只读)。在动画事件回调之外调用方法时返回null。注意:只有在从动画组件(Legacy)调用时才会设置此成员。
函数定义:public AnimationState animationState:
animatorClipInfo:与此事件相关的Animator clip信息(只读)
函数定义:public AnimatorClipInfo animatorClipInfo
animatorStateInfo:与此事件相关的animator state信息(只读)
函数定义:public AnimatorStateInfo animatorStateInfo;
floatParameter:存储在事件中的Float参数将被发送到函数。
函数定义:public float floatParameter;
functionName:要调用的函数的名称。这与调用gameObject.SendMessage(animationEvent.functionName,animationEvent)相同。调用的函数可以包含0个参数或单个参数。
函数定义:public string functionName;
intParameter:存储在事件中的Int参数将被发送到函数
函数定义:public int intParameter;
isFiredByAnimator:如果此动画事件由Animator组件触发,则返回true。
函数定义:public bool isFiredByAnimator;
isFiredByLegacy:如果此动画事件有Animation组件触发,则返回true。
函数定义:public bool isFiredByLegacy;
messageOptions:函数调用选项。如果将选项设置为SendMessageOptions.RequireReceiver(默认值),则在任何组件未拾取消息时将打印错误。
函数定义:public SendMessageOptions messageOptions;
objectReferenceParameter:存储在事件中的对象引用参数将被发送到函数。
函数定义:public Object objectReferenceParameter;
stringParameter:存储在事件中的字符串参数将被发送到函数
函数定义:public string stringParameter;
time:该事件被触发的时间.AnimationEvent从附加的clip获取时间长度。time属性确定何时处理事件。例如:如果clip的长度为2秒且时间设置为1.5f,则在应用程序启动后的1.5s调用该函数,然后每2秒调用一次。
函数定义:public float time;

3.Constructors

AnimationEvent:创建一个新的动画事件。
函数定义:public AnimationEvent();

十二、AnimationState
1.描述
  AnimationState可以完全控制animation blending.
  在大多数情况下,Animation 接口已经足够满足需求。但是如果你需要完全控制混合任何播放过程的动画,可以使用AnimationState。
  AnimationState接口允许你在播放任何动画时修改speed、weight、time以及layers。你还可以设置animation mixing和wrapMode
2.Properties

blendMode:应该使用哪种blend mode?
函数定义:public AnimationBlendMode blendMode;
代码示例:
using UnityEngine;

public class AnimationEventExample : MonoBehaviour
{
    public Animation anim;
    private void Start()
    {
        anim["leanLeft"].blendMode = AnimationBlendMode.Additive;
    }
}
clip:此animation state正在播放的clip
函数定义:public AnimationClip clip;
代码示例:
using UnityEngine;

public class AnimationEventExample : MonoBehaviour
{
    public Animation anim;
    private void Start()
    {
        //将animation clip的帧速率打印到控制台
        print(anim["walk"].clip.frameRate);
    }
}
enabled:启用/禁用动画.
函数定义:public bool enabled;
代码示例:为了使动画起效果,还需要将权重设置为高于0的值。如果禁用动画,则会暂停时间,直到再次启用动画。
using UnityEngine;

public class AnimationEventExample : MonoBehaviour
{
    public Animation anim;
    private void Start()
    {
        anim["Walk"].enabled = true;
        anim["Walk"].weight = 1.0f;
    }
}
length:animation clip的长度(以秒为单位)。
函数定义:public float length;
代码示例:
using UnityEngine;

public class AnimationEventExample : MonoBehaviour
{
    public Animation anim;
    private void Start()
    {
        print(anim["Walk"].length);
    }
}
name:动画的名称
函数定义:public string name;
normalizedSpeed:标准化的播放速度。这最常用于在两个动画之间进行混合时同步播放速度。在大多数情况下,使用动画层同步更容易也更好。
函数定义:public float normalizedSpeed;
代码示例:
using UnityEngine;

public class AnimationEventExample : MonoBehaviour
{
    public Animation anim;
    private void Start()
    {
        anim = GetComponent<Animation>();
        anim["Run"].normalizedSpeed = anim["Walk"].normalizedSpeed;
    }
}
normalizedTime:动画的标准化时间.值为1是动画的结束。值0.5是动画的中间部分。
函数定义:public float normalizedTime;
代码示例:
using UnityEngine;

public class AnimationEventExample : MonoBehaviour
{
    public Animation anim;
    private void Start()
    {
        //快进到动画的中间
        anim["Walk"].normalizedTime = 0.5f;
    }
}
speed:动画的播放速度。1是正常播放速度。负回放速度将向后播放动画。
函数定义:public float speed;
代码示例:
using UnityEngine;

public class AnimationEventExample : MonoBehaviour
{
    public Animation anim;
    private void Start()
    {
        //向后行走
        anim["Walk"].speed = -1.0f;
        //两倍行走速度
        anim["Walk"].speed = 2.0f;
    }
}
time:动画的当前时间。如果时间大于length,则将根据wrapMode进行包装。该值可以大于动画长度。在这种情况下,播放模式将重新映射采样前的时间。该值通常从0到无穷大。
函数定义:public float time;
代码示例:
using UnityEngine;

public class AnimationEventExample : MonoBehaviour
{
    public Animation anim;
    private void Start()
    {
        //回放步行动画
        anim["Walk"].time = 0.0f;
    }
}
weight:动画的权重。这将计算一条曲线的混合权重。权重是分布的,以便top layer获得一切。如果它不使用完整的权重,那么下一层将分配剩余的权重,以此类推。一旦top layer使用了所有权重,就不再有可用于较低layer的权重。Unity使用公平权重,这意味着如果较低layer需要80%且50%已经用完,则改layer不会用尽所有权重。想法,它将占50%的80%。例如:上体受wave,walk和idle影响,下体受walk和idle影响。混合权重靠混合来改变动画。甚至没有混合,有时连动画曲线都没有定义,你仍可以将混合权重加到1.曲线之间的大多数情况下权重相似。
函数定义:public float weight;
代码示例:
using UnityEngine;

public class AnimationEventExample : MonoBehaviour
{
    public Animation anim;
    private void Start()
    {
        //设置行走动画的混合权重为0.5
        anim["Walk"].time = 0.5f;
    }
}
wrapMode:动画的wrapping mode。默认情况下,wrapMode初始化为Animation组件的wrap mode中设置的值。
函数定义:public WrapMode wrapMode;
代码示例:
using UnityEngine;

public class AnimationEventExample : MonoBehaviour
{
    public Animation anim;
    private void Start()
    {
        anim["Walk"].wrapMode = WrapMode.Loop;
    }
}

3.Public Methods

AddMixingTransform:添加应该设置动画的transform.这允许你减少必须创建的动画数量。如果recursive为真,混合的transform的所有子节点也将被动画化。如果不调用AddMixingTransform,则将使用所有动画曲线,若调用则该Animation Clip便只会影响该节点及其子骨骼,而对其他骨骼关节不再影响。
函数定义:public void AddMixingTransfrom(Transform mix,bool recursive = true);
函数参数:
mix:设置动画的transform
recursive:是否为指定transform的所有子节点设置动画。
代码示例1:如果你有一个handwaving动画。你可能想要在空闲角色和行走角色上都播放handwaving动画。要么你创建2个handwaving动画,一个用于空闲角色,一个用于行走角色。或者通过混合,handwaving动画将完全控制肩部,但是下半身不会受到影响,并继续播放空闲或行走动画。因此你只需要一个handwaving动画。
using UnityEngine;

public class AnimationEventExample : MonoBehaviour
{
    public Animation anim;
    public Transform shoulder;
    private void Start()
    {
        anim["wave_hand"].AddMixingTransform(shoulder);
    }
}
代码示例2:
using UnityEngine;

public class AnimationEventExample : MonoBehaviour
{
    public Animation anim;
    private void Start()
    {
        Transform mixTransform = transform.Find("root/upper_body/left_shoulder");
        anim["wave_hand"].AddMixingTransform(mixTransform);
    }
}
RemoveMixingTransform:删除设置动画的transform。你只能传递通过AddMixingTransform函数添加的变化。如果已将transform添加为recursive,则将它递归删除。删除添加到animation state的所有混合的transform后,所有曲线将再次变为动画。
函数定义:public void RemoveMixingTransform(Transform mix);

十三、AnimationBlendMode
1.描述
  由Animation.Play函数使用
2.Properties

Blend:动画将被混合
函数定义:AnimationBlendMode.Blend
Additive:动画将被添加
函数定义:AnimationBlendMode.Additive