Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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

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
Unity/C#虚拟和覆盖故障_C#_Unity3d_Overriding_Virtual - Fatal编程技术网

Unity/C#虚拟和覆盖故障

Unity/C#虚拟和覆盖故障,c#,unity3d,overriding,virtual,C#,Unity3d,Overriding,Virtual,因此,我尝试创建自己的方法(如更新、启动等) 基本上,它可以检测输入,但使用bool方法。更像是“OnKeyDown” 我没有出错,但什么也没发生,以下是我的课程: using UnityEngine; using System.Collections; public class BeastScript : MonoBehaviour { void Update() { #region INPUT //KEYS

因此,我尝试创建自己的方法(如更新、启动等) 基本上,它可以检测输入,但使用bool方法。更像是“OnKeyDown”

我没有出错,但什么也没发生,以下是我的课程:

 using UnityEngine;
 using System.Collections;

 public class BeastScript : MonoBehaviour
 {



     void Update()
     {
         #region INPUT
         //KEYS
         if (Input.anyKeyDown)
         {
             OnKeyDown(Input.inputString);
         }

         if (Input.anyKey)
         {
             OnKeyHold(Input.inputString);
         }
         //MOUSE
         if (Input.GetMouseButtonDown(0))
         {
             OnMouseClick(0);
         }

         if (Input.GetMouseButtonDown(1))
         {
             OnMouseClick(1);
         }

         if (Input.GetMouseButtonDown(2))
         {
             OnMouseClick(2);
         }

         if (Input.GetMouseButton(0))
         {
             OnMouseClickHold(0);
         }

         if (Input.GetMouseButton(1))
         {
             OnMouseClickHold(1);
         }

         if (Input.GetMouseButton(2))
         {
             OnMouseClickHold(2);
         }

         if (Input.GetMouseButtonUp(0))
         {
             OnMouseRelease(0);
         }

         if (Input.GetMouseButtonUp(1))
         {
             OnMouseRelease(1);
         }

         if (Input.GetMouseButtonUp(2))
         {
             OnMouseRelease(2);
         }
         #endregion INPUT



     }


     public virtual void OnKeyDown(string key) { }
     public virtual void OnKeyHold(string key) { }
     public virtual void OnMouseClick(int button) { }
     public virtual void OnMouseClickHold(int button) { }
     public virtual void OnMouseRelease(int button) { }

 }
下面是导出的

 using UnityEngine;
 using UnityEngine.UI;
 using System.Collections;
 using Beast;
 using Beast.BUI;
 using Beast.Extensions;
 using System;
 using UnityEngine.Events;

 using Beast.Web;

 public class Tester : BeastScript {

     void Start()
     {

     }

     void OnGUI ()
     {

     }

     void Update ()
     {

     }

     public override void OnMouseClick(int button)
     {
         base.OnMouseClick(button);

         if (button == 0)
         {
             print("Works");
         }
     }
 }

您创建了一个空的更新方法,该方法替换了基本更新方法。在Tester类中删除它

您创建了一个空的更新方法来替换基本更新方法。在测试仪类中删除它

如果您在基类方法
Update
中运行脚本,请确保调用
base.Update()

void Update ()
{
    base.Update();

    // special Update code
}

如果在基类方法
Update
中运行脚本,请确保调用
base.Update()

void Update ()
{
    base.Update();

    // special Update code
}

继承要重写的类的方法时,必须将这些方法声明为虚拟的。在您的示例中,两个类都有一个
私有void Update()
(当不声明访问修饰符时,它是隐式私有的)。 这意味着,继承类(Tester)甚至不知道它的基类已经有了Update()方法。因此,它不会覆盖它,而是隐藏它。一旦Unity调用Tester的Update()方法,它将完全无效,因为它是空的

您想要的是让测试员的Update()方法包含BeastScript的Update()方法的所有内容,并可以选择对其进行扩展。可以这样完成:

public class BeastScript : MonoBehaviour
{
    protected virtual void Update() // "protected" so subclasses can see it
    {                               // and "virtual" so subclasses can override it
        if (Input.anyKeyDown)
            ...
    }
}

public class Tester : BeastScript
{
    protected override Update() // "protected" because overriding methods must not be less accessible than the method they override
    {                           // and "override" to specify that this method overrides a virtual method
        // optional: do stuff before calling BeastScript.Update()
        base.Update(); // this calls BeastScript.Update()
        // optional: do stuff after calling BeastScript.Update()
    }
}

继承要重写的类的方法时,必须将这些方法声明为虚拟的。在您的示例中,两个类都有一个
私有void Update()
(当不声明访问修饰符时,它是隐式私有的)。 这意味着,继承类(Tester)甚至不知道它的基类已经有了Update()方法。因此,它不会覆盖它,而是隐藏它。一旦Unity调用Tester的Update()方法,它将完全无效,因为它是空的

您想要的是让测试员的Update()方法包含BeastScript的Update()方法的所有内容,并可以选择对其进行扩展。可以这样完成:

public class BeastScript : MonoBehaviour
{
    protected virtual void Update() // "protected" so subclasses can see it
    {                               // and "virtual" so subclasses can override it
        if (Input.anyKeyDown)
            ...
    }
}

public class Tester : BeastScript
{
    protected override Update() // "protected" because overriding methods must not be less accessible than the method they override
    {                           // and "override" to specify that this method overrides a virtual method
        // optional: do stuff before calling BeastScript.Update()
        base.Update(); // this calls BeastScript.Update()
        // optional: do stuff after calling BeastScript.Update()
    }
}

如果其中任何一个答案对你有用,那么如果你接受了这个答案,对其他人也会有帮助。如果没有,请随意评论给出的答案,或更新您的问题。如果任何答案对您有效,如果您接受该答案,将对其他人有所帮助。如果没有,请随意评论给出的答案,或更新您的问题。