Unity/C#虚拟和覆盖故障
因此,我尝试创建自己的方法(如更新、启动等) 基本上,它可以检测输入,但使用bool方法。更像是“OnKeyDown” 我没有出错,但什么也没发生,以下是我的课程: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
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()
}
}
如果其中任何一个答案对你有用,那么如果你接受了这个答案,对其他人也会有帮助。如果没有,请随意评论给出的答案,或更新您的问题。如果任何答案对您有效,如果您接受该答案,将对其他人有所帮助。如果没有,请随意评论给出的答案,或更新您的问题。