我正在嘗試通過使用介面升級特定的大炮,我面臨的問題是由于某種原因函式被正確呼叫并且沒有錯誤,但實際上引數并沒有按預期“升級”。
BaseWeapon.cs
public class BaseWeapon : MonoBehaviour
{
public new string name;
public int level = 1;
public int damage;
public int cost;
private BaseEnemy target;
public IDoDamage damageType;
public IDoUpgrade upgradeType;
public int TryDoDamage(BaseEnemy target, int damage)
{
this.target = target;
int dmg = (int)damageType?.DoDamage(target, damage);
target.UpdateHealth();
return dmg;
}
public void TryDoUpgrade(BaseCannon cannon)
{
Debug.Log("Inside TryDoUpgrade SUCCESS"); // This debug works
upgradeType?.DoUpgrade(cannon);
Island.Instance.Spend(cannon.cost);
}
上面的除錯成功了,按照預期從玩家身上減去了金幣。
DefCannon.cs我用它來實體化一個BaseCannon繼承自BaseWeapon,帶有自定義引數,這是默認的大炮,我也有一個FireCannon作為例子,它們都繼承自BaseCannon,而后者又繼承自BaseWeapon.:
public class DefCannon : BaseCannon
{
public void Init(int level)
{
name = "Defcannon";
this.level = level;
cannonMat = Cannonballs.cbCannonMat["Default"];
damage = 50 * level;
ballMat = Cannonballs.cbMat["Default"];
cbSpeed = Cannonballs.cbSpeed["Default"];
minPrecision = 0.91f;
maxPrecision = 1.11f;
minReload = 0.5f;
maxReload = 1.0f;
damageType = new DefDamage(level);
upgradeType = new DefUpgrade(this, level);
}
}
我認為問題也可能出在這里 upgradeType = new DefUpgrade(this, level);
this = DefCannon.cs // which inherits from BaseCannon
然而DefUpgrade(BaseCannon baseCannon, int level)DefUpgrade 要求的是BaseCannon,而不是我們BaseCannon在這種情況下給它一個孩子,即DefCannon,這可能是它不起作用的原因嗎?我將如何解決這個問題,我沒有BaseCannon從子腳本中參考腳本,有沒有辦法做到這一點this.BaseCannon(以某種方式呼叫父類?)
澄清一下,上面的腳本僅用于設定引數,我有一個 prefabCannon,沒有腳本,當我實體化那個 prefabCannon 時,我添加腳本DefCannonor FireCannon,這取決于我想要實體化的大炮,這樣我就可以擁有它們所有人都使用他們都需要的通用函式,但也有自定義引數等。
DefUpgrade.cs這是問題所在,Debug.LogBaseWeapon 腳本中的 可以作業,但是當它進入DefUpgrade.cs并嘗試呼叫時執行的下一步DoUpgrade()失敗,因為Debug.Log在該腳本中從未呼叫過:
public class DefUpgrade : IDoUpgrade
{
public int level;
public DefUpgrade(BaseCannon baseCannon, int level)
{
this.level = level;
baseCannon.cost = DefUpgradeDictionary.cost[level];
}
public void DoUpgrade(BaseCannon baseCannon)
{
Debug.Log("Inside DoUpgrade SUCCESS"); // This debug is never reached/called
var baseDamage = baseCannon.damage / baseCannon.level;
baseCannon.level ;
baseCannon.damage = baseDamage * level;
var lvl = baseCannon.level;
baseCannon.damageType = new DefDamage(lvl); //CHECK IF IT WORKS
baseCannon.minPrecision = DefUpgradeDictionary.minPrecision[lvl];
baseCannon.maxPrecision = DefUpgradeDictionary.maxPrecision[lvl];
baseCannon.minReload = DefUpgradeDictionary.minReload[lvl];
baseCannon.maxReload = DefUpgradeDictionary.maxReload[lvl];
baseCannon.cost = DefUpgradeDictionary.cost[lvl];
}
}
我使用完全相同的介面結構來造成傷害,因為所有大炮都需要造成傷害,但再次使用不同的引數,在該結構中我沒有問題,但是當我為升級重新創建它時,它似乎不起作用,但這是什么原因令人困惑的是,沒有控制臺錯誤,沒有丟失的參考,它除錯函式 A,然后呼叫函式 B,但是函式 B 中的除錯永遠不會被呼叫!
IDoUpgrade.cs 介面
public interface IDoUpgrade
{
void DoUpgrade(BaseCannon cannon);
}
打電話 TryDoUpgrade()
baseCannon = PlayerRays.Instance.baseCannon;
if (PlayerRays.Instance.safe && Island.Instance.gold >= baseCannon.cost)
{
PlayerRays.Instance.baseWeapon.TryDoUpgrade(baseCannon);
}
這最后 2 個腳本作業正常,問題似乎不存在。
Thank you for looking into this I appreciate it a lot as ive been trying to figure this out for almost 2 days now.
Update1: Added BaseCannon.cs:
public class BaseCannon : BaseWeapon
{
private Transform cannon, cylinder, spawn, closestEnemy;
private MeshRenderer mesh;
private GameObject flame;
private List<Transform> enemyShips;
public Material cannonMat, ballMat;
public float cbSpeed;
private float aliveTime = 15f;
public float minPrecision, maxPrecision, minReload, maxReload;
void Start()
{
cannon = transform.Find("Cannon");
cylinder = cannon.transform.Find("Cylinder");
spawn = cylinder.transform.Find("Spawn");
flame = spawn.transform.Find("Flame").gameObject;
flame.SetActive(false);
mesh = cannon.GetComponent<MeshRenderer>();
mesh.material = cannonMat;
}
}
uj5u.com熱心網友回復:
我認為錯誤出在 BaseWeapon 類中。(如果我正確理解了結構)您正在傳遞其中定義了 upgradeType 的 BaseCannon,但您正在從 BaseWeapon 呼叫該方法。
public class BaseWeapon : MonoBehaviour
{
public new string name;
public int level = 1;
...
public IDoUpgrade upgradeType;
public void TryDoUpgrade(BaseCannon cannon)
{
Debug.Log("Inside TryDoUpgrade SUCCESS"); // This debug works
upgradeType?.DoUpgrade(cannon);
// in fact the upgrade is null as it's defined in the cannon
// not the weapon.
if (upgradeType == null)
{
Debug.Log("No upgrade defined. Create from cannon");
// set the upgrade from the cannon, and then call it
upgradeType = cannon.upgradeType;
upgradeType?.DoUpgrade(cannon);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/381342.html
標籤:c# unity3d inheritance interface
