Unity3d中的多态性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3d中的多态性相关的知识,希望对你有一定的参考价值。
我需要一些帮助。我不知道这是否可能:
我有2个脚本,它们与Base和interactRock脚本进行交互。
interactRock脚本扩展了interactBase脚本。
interactRock会覆盖“interact()”函数
所以我尝试获取Object的引用并调用子函数。
但它似乎不起作用。也许你可以帮助我?
码:
interactBase:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class interactBase : MonoBehaviour {
public interactBase(){
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public void interact(){
}
}
rockInteract:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class rockInteract : interactBase {
public bool triggered;
public rockInteract(){
}
// Use this for initialization
void Start () {
triggered = false;
}
// Update is called once per frame
void Update () {
}
public new void interact(){
triggered = true;
print ("working");
}
}
调用脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class triggerScript : MonoBehaviour {
Animator anim;
SpriteRenderer sprite;
public bool triggered;
public GameObject toTrigger;
interactBase baseFunc;
// Use this for initialization
void Start () {
anim = GetComponent<Animator> ();
sprite = GetComponent<SpriteRenderer> ();
triggered = false;
baseFunc = toTrigger.GetComponent<interactBase>();
print (baseFunc);
}
// Update is called once per frame
void Update () {
transform.position += Vector3.zero;
if (triggered == true) {
//print (baseFunc.interact ());
baseFunc.interact ();
triggered = false;
}
}
}
谢谢
答案
问题是您需要将基础交互定义为
virtual void interact()
和孩子一样
override void interact
通过基类指针调用子交互。使用new并不能实现这一点。
new确实意味着“child有它自己的方法,它恰好具有相同的名称,作为基类中完全不同的方法。当你使用子指针但是当你使用基指针时不应该调用这个新方法因为base有自己的方法,名称为“。虚拟和覆盖意味着“子具有相同方法的不同版本,无论您使用何种类型的指针,都可以调用该方法”。
以上是关于Unity3d中的多态性的主要内容,如果未能解决你的问题,请参考以下文章