Unity 3d动画

时间:2019-05-15 18:51:03

标签: c# unity3d animation 3d

我是Unity3d的新手,只是在玩统一动画,所以我尝试实现2个主UI按钮,例如当按下其中任何一个时,应检查条件是否已经通过第2个按钮播放了动画(如果有)是的,然后使用反向动画从场景中删除那些游戏对象,否则播放附加到特定按钮的默认动画。

在6种情况下,问题只有4种正在运行,其中2种没有执行(在代码中标记为 Case Not Operational )。

Animation anim;
private bool isOpen = false; 
private bool open = false;
// Start is called before the first frame update
void Start()
{
    anim = GetComponent<Animation>();
    //isOpen = false;
    //open = false;

}

// Update is called once per frame
void Update()
{

}

void OnGUI()
{
    isOpen = GUI.Toggle(new Rect(50, 50, 200, 100), isOpen, "IsOpen");
    open = GUI.Toggle(new Rect(65, 65, 200, 100), open, "Open");
}
public void ButtonControl()
{
    string name = EventSystem.current.currentSelectedGameObject.name;
    if (name == "Main Button 1")
    {
        if (isOpen == false && open == false)
        {   Debug.Log("False False 1");
            Anim1();
            isOpen = true;
        }
        else if (isOpen == false && open == true) // case not operational
        {   Debug.Log("False True 2");
            ReverseAnim_2();
            open = false;
            Anim1();
            isOpen = true;
        }
        else if(isOpen == true)
        {
            Debug.Log("True 3");
            ReverseAnim_1();
            isOpen = false;
        }
    }


    else if (name == "Main Button 2")
    {
        if (open == false && isOpen == false)
        {   Debug.Log("False False 4");
            Anim2();
            open = true;
        }
        else if(open == false && isOpen == true) // case not operational
        {   Debug.Log("False True 5");
            ReverseAnim_1();
            isOpen = false;
            Anim2();
            open = true;
        }
        else if(open == true)
        {
            Debug.Log("True 6");
            ReverseAnim_2(); 
            open = false;
        }
    }
}

void ReverseAnim_1()
{
    anim["1"].speed = -1;
    anim["1"].time = anim["1"].length;
    anim.Play();
}

void Anim1()
{
    anim["1"].speed = 1;
    anim.Play();
}

void Anim2()
{
    anim["2"].speed = 1;
    anim.Play();
}

void ReverseAnim_2()
{
    anim["2"].speed = -1;
    anim["2"].time = anim["2"].length;
    anim.Play();
}

2 个答案:

答案 0 :(得分:1)

问题是您有两个Main_B2脚本,它们分别跟踪isOpenopen字段的值。

一个解决方案是将字段static设置为Main_B2的所有实例都相同。

Animation anim;
private static bool isOpen = false; 
private static bool open = false;

如果这样做,您的代码应该按预期的方式工作-Main_B2的每个实例在引用isOpenopen时都将引用相同的字段。


话虽如此,如果您想尝试重复使用代码,static字段可能会变得很草率,因此更好的选择可能是只一个实例 {{ 1}},例如Main_B2,而不是每个按钮上的一个。

然后,您可以在其中将按钮对象拖动到的Canvas字段和动画的public GameObject字段中。

private Animation

然后在public GameObject button1 public GameObject button2 private Animation anim1 private Animation anim2 中输入

Start

然后,无论您指的是anim1 = button1.GetComponent<Animation>(); anim2 = button2.GetComponent<Animation>(); 还是指animanim1

anim2

答案 1 :(得分:0)

您的脚本“ anim”变量是一个Animation。通常,要调整动画参数,请在Animator上而不是在Animation上设置它们。但是也许您的解决方案可以工作。

为清楚起见。动画师负责组织动画的播放方式,时间,持续时间以及过渡方式。

我个人建议您使用具有行为模式和动画之间过渡的动画制作器。代替当前的方法。

或者使用资产商店中的多个Tweening资产包之一。它们专门用于创建用户界面效果,如您所描述的。

如果您一直被卡住,请至少考虑以下解决方案:-)