我對 C# 和 Unity 很陌生,我試圖弄清楚如何通過基類處理子類。
我正在制作紙牌游戲。我已經創建了一個基類 PlayerCard,它具有子類,例如 Minion : PlayerCard。
我目前的結構是 PlayerCard 類在開始時從甲板上像這樣實體化
public class PlayerDeck : MonoBehaviour{
[SerializeField] PlayerCard[] playerCardArray;
private int xPos = 2;
public void DrawCards()
{
var cardIndex = Random.Range(0, playerCardArray.Length);
AddCardToPlayer(playerCardArray[cardIndex]);
}
private void AddCardToPlayer(PlayerCard myCard)
{
Vector3 cardPos = new Vector3(transform.position.x xPos, transform.position.y, transform.position.z);
PlayerCard newCard = Instantiate(myCard, cardPos, transform.rotation) as PlayerCard;
xPos = xPos 2;
}
我希望我的基類 (PlayerCard) 處理所有平凡的事情,例如拖動和移動卡片,因為它們對于所有卡片都是相同的。
private void OnMouseDown()
{
ToggleDrag();
}
void Update()
{
if (DraggingON) { Drag(); }
}
private void ToggleDrag()
{
Debug.Log(playerCard);
mouseOffset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, mouseScreenPoint.z));
if (DraggingON)
{
DraggingON = false;
SnapCardToPosition();
}
else
{
DraggingON = true;
SnapPositionX = transform.position.x; //Return to same x position if user has not hovered other available slot
SnapPositionY = transform.position.y; //Return to same y position if user has not hovered other available slot
//Variables above will be reset to default position x/y when user has hovered a slot but then moved object away from the slot, so reset to default
defaultPositionX = transform.position.x;
defaultPositionY = transform.position.y;
}
}
private void Drag()
{
Vector3 currentMouseScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, mouseScreenPoint.z);
Vector3 currentMousePosition = Camera.main.ScreenToWorldPoint(currentMouseScreenPoint) mouseOffset;
transform.position = currentMousePosition;
}
我的問題在于,當呼叫 SnapCardToPosition 時,我希望子類(無論它是什么)接管并處理與它們被拖入的位置的互動。
private void SnapCardToPosition()
{
Vector2 NewCardPosition = new Vector2(SnapPositionX, SnapPositionY);
transform.position = NewCardPosition;
//Dynamically call the subclass here?
}
所以子類看起來像這樣
public class Minion : PlayerCard{
[SerializeField] int Damage = 1;
public void HandleCardPlacement()
{
//Do something
}
我還沒有弄清楚如何使用我的結構來實作這一點,還是從根本上是錯誤的?
uj5u.com熱心網友回復:
- 讓你的方法不是
private(=只有這個類可以看到這個)而是protected(=這個和任何派生類都可以看到這個) - ,使您無論是方法
virtual(如果有一個共同的基礎行為)或者abstract(如果每卡必須從頭開始實作它)和override它的子類
在您的基類中,例如
protected virtual void SnapCardToPosition()
{
Vector2 NewCardPosition = new Vector2(SnapPositionX, SnapPositionY);
transform.position = NewCardPosition;
}
然后在子類中
protected override void SnapCardToPosition()
{
// make sure that the base implementation is executed first
base.SnapCardToPosition();
// do additional stuff
}
所以這里每個子類都可以決定
- 無論
override是方法還是簡單地保留他默認的基類之一 - 如果它覆寫它可以決定是否以及何時通過呼叫默認行為
base.SnapCardToPosition();
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/322895.html
