将旧的Unity代码升级到Unity 5

时间:2017-01-21 22:04:32

标签: c# unity3d

在触发按钮上播放动画的代码似乎不起作用。我在Youtube上看到了一个视频,并且在视频中使用了一个简单的animation.Play();,但是我无法在计算机上使用它。我做错了什么或团结改变了什么?请帮助我无法在网上找到解决方案。所有“解决方案都不起作用”。

这是我得到的错误:

  

类型UnityEngine.Component不包含播放定义   并且没有Play类型的扩展方法UnityEngine.component   找到了

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

public class animationtrigger : MonoBehaviour {


    void Start()
    {

    }
    int speed = 10;
    // Update is called once per frame
    void Update () {
        if (Input.GetKeyDown("N"))
        {
            animation.Play("Cube|moving side");
            //transform.Translate(1 * Vector3.forward * Time.deltaTime * speed);
            //Animator anim = GetComponent<Animator>();
            //if (null != anim)
        //  {
        //      anim.Play("Cube|moving side");
        //  }
        }
    }
}

2 个答案:

答案 0 :(得分:4)

  

我做错了什么或团结改变了什么?

Unity改变了。过去几周我见过similar个问题。虽然我不认为它们是重复的,但在未来的问题中回答所有这些是有意义的。

animation 变量Component下定义为public变量,MonoBehaviour继承自MonoBehaviour。然后,您的代码将继承自animation,并且您可以访问Component

这些是不推荐使用的public Component animation { get; } public Component audio { get; } public Component camera { get; } public Component collider { get; } public Component collider2D { get; } public Component constantForce { get; } public Component guiElement { get; } public Component guiText { get; } public Component guiTexture { get; } public Component hingeJoint { get; } public Component light { get; } public Component networkView { get; } public Component particleEmitter { get; public Component particleSystem { get; } public Component renderer { get; } public Component rigidbody { get; } public Component rigidbody2D { get; } 类的完整变量列表:

GetComponent<ComponentName>()

访问附加到同一脚本的组件的新方法

使用AudioSource。大写该变量的第一个字母,使其成为组件类。成为一个例外是音频 animation.Play("Cube|moving side");代替音频。

1 GetComponent<Animation>().Play("Cube|moving side");变为rigidbody2D.velocity

2 GetComponent<Rigidbody2D>().velocity变为rigidbody.velocity

3 GetComponent<Rigidbody>().velocity变为renderer.material

4 GetComponent<Renderer>().material变为particleSystem.Play()

5 GetComponent<ParticleSystem>().Play()变为collider2D.bounds

6 GetComponent<Collider2D>().bounds变为collider.bounds

7 GetComponent<Collider>().bounds变为audio.Play("shoot");

8 GetComponent<AudioSource>().Play("shoot");变为camera.depth

9 GetComponent<Camera>().depth变为Animation myAnimation; void Start() { //Cache animation component myAnimation = GetComponent<Animation>(); } void Update() { if(somethingHappens) { //No GetComponent call required again myAnimation.Play("Cube|moving side"); } }

我没有把它们全部放在一起,因为下面的例子应该指导任何人这样做。这些是SO上提问和询问最多的组件。

缓存组件

您可以缓存组件,以便每次都没有GetComponent。

local i = 1
for i == 1
    game.Workspace.Time.Value = 0
    wait(120)
    game.Workspace.Time.Value + 0.5
end

答案 1 :(得分:-1)

如果您正在使用动画制作者且想要播放特定状态,那么您可以这样做:

animator.Play("stateName");

我在下面的评论代码中看到了这一点。这应该是有效的。如果没有发生任何事情,请确保“Cu​​be | moving side”是STATE名称而不是ANIMATION名称。还要确保状态实际包含动画,并且动画实际上包含帧数据。

(下面,我有2个状态(Move和Idle)。状态名称是“Move”,而动画名称是“test”。) enter image description here

如果我想切换到移动状态,我会调用 animator.Play(“移动”)

此外,我不建议明确地播放状态。如果你可以管理它通常更好地制作状态树并使用参数触发动画。您在上图中看到我之间有两种状态和转换。您可以指定可以使我的动画师从一个切换到另一个的参数。

enter image description here

这里我使用“示例动画触发器”使动画师从空闲状态切换到移动状态。我可以在代码中执行此操作:

animator.SetTrigger("ExampleAnimTrigger");

这是使用Unity动画的更现代的方式,所以我强烈建议选择它。

Here's the documentation!