我是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();
}
答案 0 :(得分:1)
问题是您有两个Main_B2
脚本,它们分别跟踪isOpen
和open
字段的值。
一个解决方案是将字段static
设置为Main_B2
的所有实例都相同。
Animation anim;
private static bool isOpen = false;
private static bool open = false;
如果这样做,您的代码应该按预期的方式工作-Main_B2
的每个实例在引用isOpen
或open
时都将引用相同的字段。
话虽如此,如果您想尝试重复使用代码,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>();
还是指anim
或anim1
:
anim2
答案 1 :(得分:0)
您的脚本“ anim”变量是一个Animation。通常,要调整动画参数,请在Animator上而不是在Animation上设置它们。但是也许您的解决方案可以工作。
为清楚起见。动画师负责组织动画的播放方式,时间,持续时间以及过渡方式。
我个人建议您使用具有行为模式和动画之间过渡的动画制作器。代替当前的方法。
或者使用资产商店中的多个Tweening资产包之一。它们专门用于创建用户界面效果,如您所描述的。
如果您一直被卡住,请至少考虑以下解决方案:-)