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中的多态性的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D New Input System 鼠标左键单击双击长按配置及实现接口多态用法

每个人单核苷酸多态性(SNP)形成的原因是啥?

C/C++编程笔记:C++中的函数重载和浮动

多态性和动态铸造

unity3d游戏开发学习分享之表面着色器讲解

java中封装,继承,多态,接口学习总结