如何在继承类的重写函数中使用变量

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

我有两个类(其中一个是从另一个类继承的),我希望覆盖我在类中定义的函数之一,但是当尝试使用继承类中定义的变量时,它给我错误“变量无法访问”由于其保护级别”我猜测这是因为它试图使用继承类中的变量而不是覆盖所在类中的变量,但我不确定如何获得统一来使用类中的变量不是继承类中的那些。 示例:

public class InheritedClass : MonoBehaviour
{
    public int x;
    public virtual void Divideby2(int num) {
        Debug.Log(num/2);
    }
}
public class Inheritor1 : InheritedClass
{
}
public class Inheritor2 : InheritedClass
{
    public override void DivideBy2(int num) {
        Debug.Log(num/x)
    }
}

这是我所拥有的简化版本,其中 InheritedClass 是一个类/脚本,我有多个其他类/脚本继承自(Inheritor1 和 Inheritor2),但是我想通过使用其重写其中一个脚本(Inheritor2)中的函数x 变量,但在这种情况下,我会收到错误: Assets\Scripts\Inheritor2.cs(4,14): error CS0122: 'InheritedClass.x' is inaccessible due to its protected level

实际代码

public class Weapon : MonoBehaviour
{
    public GameObject AttackPrefab, SpecialPrefab, ThisWeaponPrefab, AttackSequenceFinisherPrefab;
    private Vector3 MousePosition;
    [SerializeField] private float SpecialCooldown, AttackCooldown, FinisherCooldown, AttackSequenceTimeToEnd;
    private float TimePassed, RotationY, TimeToHold, AttackSequenceEndTime, SpecialCooldownTimer, FinisherCooldownTimer;
    public int MaxAttackSequence;
    [HideInInspector] public int AttackSequence;
    private bool CanSpecial, CanAttack;

    public virtual void AttackDetermine(int num)
    {
        MousePosition = Input.mousePosition;
        if (MousePosition.x < 0) {MousePosition.x = 0;}
        if (MousePosition.x > Screen.width) {MousePosition.x = Screen.width;}
        if (MousePosition.y < 0) {MousePosition.x = 0;}
        if (MousePosition.y > Screen.height) {MousePosition.x = Screen.height;}
        MousePosition.y -= (Screen.height / 2);
        MousePosition.x -= (Screen.width / 2);
        RotationY = Mathf.Atan2(MousePosition.y, MousePosition.x) * Mathf.Rad2Deg - 90;
        if ((num == 2) & (Character.instance.BusyTime <= 0) & (SpecialCooldownTimer >= 0)){
            CanSpecial = true;
        }
        else if ((num == 1) & (Character.instance.BusyTime <= 0) & (FinisherCooldownTimer <= 0)) {
            CanAttack = true;
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bow : Weapon
{
    public Bow Instance;
    // Start is called before the first frame update
    public override void AttackDetermine(int num) {
        MousePosition = Input.mousePosition;
        if (MousePosition.x < 0) {MousePosition.x = 0;}
        if (MousePosition.x > Screen.width) {MousePosition.x = Screen.width;}
        if (MousePosition.y < 0) {MousePosition.x = 0;}
        if (MousePosition.y > Screen.height) {MousePosition.x = Screen.height;}
        MousePosition.y -= (Screen.height / 2);
        MousePosition.x -= (Screen.width / 2);
        RotationY = Mathf.Atan2(MousePosition.y, MousePosition.x) * Mathf.Rad2Deg - 90;
        Vector3 relativePos = Character.instance.InGameCharacter.transform.position - Enemy.instance.InGameCharacter.transform.position;
        RotationEnemy = Quaternion.LookRotation(relativePos, Vector3.up);
        if ((num == 2) & (Character.instance.BusyTime <= 0) & (SpecialCooldownTimer >= 0)){
            CanSpecial = true;
        }
        else if ((num == 1) & (Character.instance.BusyTime <= 0) & (FinisherCooldownTimer <= 0)) {
            CanAttack = true;
        }
    }
}

应该补充一点,弓的脚本尚未完全完成(当我开始尝试修复此错误时),并且会给出另一个有关 RotationEnemy 的单独错误,您可以暂时将其删除或将其正确定义为变量

c# function class unity-game-engine
1个回答
0
投票

问题出在我使用 private 而不是 protected 例如我应该使用:

protected int x

而不是

private int x
© www.soinside.com 2019 - 2024. All rights reserved.