Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按下按钮不工作时启动动画_C#_Unity3d_Unity5 - Fatal编程技术网

C# 按下按钮不工作时启动动画

C# 按下按钮不工作时启动动画,c#,unity3d,unity5,C#,Unity3d,Unity5,对于我最近的项目,我需要一扇门打开,如果用户在它前面,并按下“e” 这是按钮的代码: using UnityEngine; public class Button : MonoBehaviour { public Animator Door; // In the editor, give a reference to your door. It must have an Animator script for this to work void OnTriggerE

对于我最近的项目,我需要一扇门打开,如果用户在它前面,并按下“e”

这是按钮的代码:

using UnityEngine;

public class Button : MonoBehaviour
{

    public Animator Door; // In the editor, give a reference to your door. It     must have an Animator script for this to work

    void OnTriggerEnter(Collider c)
    {
        if (c.gameObject.tag == "Player")
        {
            //Text = "E to interact!" 

            if (Input.GetKeyDown("e"))
            {
                print("´Test");
                GetComponent<Animator>().SetTrigger("OnPress"); // The button's animator goes to "pressed" state
                Door.SetTrigger("Open");  // The door's animator goes to "open" state
            }
        }
    }
}
使用UnityEngine;
公共类按钮:MonoBehavior
{
public Animator Door;//在编辑器中,提供门的引用。它必须有一个动画师脚本才能工作
无效对撞机(对撞机c)
{
如果(c.gameObject.tag==“玩家”)
{
//Text=“E进行交互!”
if(Input.GetKeyDown(“e”))
{
打印(“测试”);
GetComponent

从空闲到打开的转换:

按钮上连接有门:

所以我这里有两个问题,第一个是-对于上面的代码,如果我按下E,什么都不会发生。没有错误,没有任何动作。 如果我删除
Input.GetKeyDown(“e”)
并使按钮与触发器啮合并在其中运行,它会说

MissingComponentException:没有“Animator”附加到 “按钮”游戏对象,但脚本正在尝试访问它。您 可能需要在游戏对象“Button”中添加一个动画师。或者 脚本在使用之前需要检查组件是否已连接


如果您需要更多信息,请告诉我。谢谢!

好的,您的交互方法是错误的。首先,在触发时输入只起作用一次。这是在您输入触发时。因此,它不会接受按键事件。您必须将代码移到不断调用它的位置。如果需要任何按键事件,则它会被激活这将解决你的问题

至于第二个问题,我很确定你从其他地方复制粘贴了这段代码。只有画布UI按钮有动画状态。你的按钮是普通网格,而不是UI按钮。因此在代码中设置状态按钮将不起作用,即

GetComponent().SetTrigger(“OnPress”);//按钮的动画程序进入“按下”状态

除非您使用的是画布按钮,否则脚本不起作用。错误描述中已经提到错误,您的按钮网格没有动画师。请尝试对该行进行注释,看看它是如何工作的

编辑:

我经历了你的转换你的代码应该是

door.GetComponent<Animator>().SetTrigger("OnPress"); 
door.GetComponent().SetTrigger(“OnPress”);
而不是

GetComponent<Animator>().SetTrigger("OnPress");
GetComponent().SetTrigger(“OnPress”);

因为它正在尝试调用门动画师的OnPress状态。如果出现任何问题,请在下面评论更多信息。很抱歉,没有首先注意到这一点。

好的,您的交互方法是错误的。首先,在触发时输入将只起作用一次。这是在您输入触发器时。因此它不会接受Keypress事件。您必须移动e代码,在那里它将不断被调用。在那里,如果它需要任何关键事件,那么它将启动。这将解决您的问题1

至于第二个问题,我很确定你从其他地方复制粘贴了这段代码。只有画布UI按钮有动画状态。你的按钮是普通网格,而不是UI按钮。因此在代码中设置状态按钮将不起作用,即

GetComponent().SetTrigger(“OnPress”);//按钮的动画程序进入“按下”状态

除非您使用的是画布按钮,否则脚本不起作用。错误描述中已经提到错误,您的按钮网格没有动画师。请尝试对该行进行注释,看看它是如何工作的

编辑:

我经历了你的转换你的代码应该是

door.GetComponent<Animator>().SetTrigger("OnPress"); 
door.GetComponent().SetTrigger(“OnPress”);
而不是

GetComponent<Animator>().SetTrigger("OnPress");
GetComponent().SetTrigger(“OnPress”);

因为它正在尝试调用门动画师的OnPress状态。如果出现任何问题,请在下面评论更多信息。很抱歉,没有首先注意到这一点。

您可以选择过渡并在此处显示它吗?您可以选择过渡并在此处显示它吗?好的,代码现在就可以工作了!是的,我复制并粘贴了我之前提出的问题中的内容ed.该代码来自@Toaster。但是,我现在得到“参数‘打开’不存在。”作为一个错误。你能帮我解决吗?我认为应该还有问题。SetTrigger(“打开”);您不能播放这样的剪辑。这只是根据参数设置触发器。大多数情况下会出现错误。您可能必须重新制作动画。请再次尝试与动画师联系。这是错误的动画师触发方法。您的动画师未正确设置。请重新设置。如果您要播放特定的剪辑,只需说“动画师”Object.Play(“Clipname”);我推荐的简单方法是创建四个单独的剪辑。空闲关闭、关闭、空闲打开、打开、剪辑。然后设置它们的转换,如关闭->空闲关闭和打开->空闲打开。然后只需说animatorobj.Play(“关闭”)和animatorobj.Play(“打开”)。这将直接转换状态而不使用参数变量。默认情况下,我将保持空闲状态作为默认动画。谢谢你们两个!你们的答案完美无瑕:)好的,代码现在就可以工作了!是的,我复制并粘贴了我之前问过的一个问题的代码。该代码来自@Toaster。但是,我现在明白了“参数‘打开’不存在。”作为一个错误。您能帮我解决吗?我认为应该仍然存在问题。SetTrigger(“打开”);您不能播放这样的剪辑。这只是根据参数设置触发器。大多数情况下会出现错误。您可能必须重新制作动画。请再次尝试与动画师联系。这是错误的动画师触发方法。您的动画师未正确设置。请重新设置。如果您要播放特定的剪辑,只需说“动画师”Object.Play(“Clipname”);我在这里推荐的简单方法是创建四个单独的剪辑。空闲关闭、关闭、空闲打开、打开、剪辑。然后设置它们的转换,如关闭->空闲关闭和打开->空闲打开。然后只说animatorobj.Play(“关闭”)和animatorobj.Play(“打开”)。这将直接转换状态,而无需参数