Unity3d中的多态性

问题描述 投票:0回答:1

我需要一些帮助。我不知道这是否可能:

我有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;
        }
    }
}

谢谢

c# unity3d polymorphism
1个回答
2
投票

问题是您需要将基础交互定义为

virtual void interact()

和孩子一样

override void interact

通过基类指针调用子交互。使用new并不能实现这一点。

new确实意味着“child有它自己的方法,它恰好具有相同的名称,作为基类中完全不同的方法。当你使用子指针但是当你使用基指针时不应该调用这个新方法因为base有自己的方法,名称为“。虚拟和覆盖意味着“子具有相同方法的不同版本,无论您使用何种类型的指针,都可以调用该方法”。

© www.soinside.com 2019 - 2024. All rights reserved.