2016-05-25 22 views
0

基本的に、スーパークラスには、サブクラスで設定される変数(またはいずれかが動作するプロパティ)が含まれている必要があります。私は2つのクラスを使用せずにこれを行う方法があるかどうかはわかりません。一つは変数を含むインターフェースですが、メソッドを含む別のクラスですが、そこにあると仮定します。あなたが想像しているように、私はC#の初心者です。C#で抽象変数と非抽象メソッドを持つスーパークラスを作成する

これはUnityのプロジェクト用です。スーパークラスは、すべてのサブクラス(文字)が使用する一般的な文字クラスになります。

編集:他の変数やメソッドの多くは、それが

using UnityEngine; 
using System.Collections; 

public abstract class CharacterClass : MonoBehaviour { 

    int MaxHitPoints { get; set; } 
    int ArmorRating { get; set; } 
    int Speed { get; set; } 
    int Strength { get; set; } 
    int Agility { get; set; } 

    void changeHP(int change) 
    { 
     MaxHitPoints += change; 
    } 

} 
+0

サブクラスが異なるデフォルト値または異なる定数値を設定することを意味しますか? –

+0

これはあまりにも一般的な質問です。これまでに試したことが分かりますか? – bodangly

+1

デフォルト値を設定する(すなわち、文字レベルとして最大HPを変更する) – Edogmonkey

答えて

2

どうあるべきかのザップレビューを後で追加が、ここにありますスーパークラスは、一般的な文字クラス

でしょうか?しかし、本当にそのようなことはありません - 統一は、ECSシステムです。

あなたができることは、GameObjectにコンポーネントを追加することです。つまり、振る舞い(レンダラ、骨のアニメーター、タイマー、カメラ、コライダーなど)をGameObjectに追加することだけです。

Unityに継承のようなものはありません。でも、漠然とOO。ユニティを使用すると、Photoshopのを言う使用して似ている!

(もちろん、ユニティでコンポーネントを作成するための執筆として現在使用されてしまっ言語は、オブジェクト指向言語であるが、それは無関係だが、可能性明日に変更しても、Unityをどのような方法でも作成することはできません。)

+0

私は何をしているのか分かりませんので、私はこれについて多くの読書をしています。あなたの助けをもう一度ありがとう。 – Edogmonkey

0

Unityではオブジェクト指向のプログラミングの概念は引き続き使用できますコンポーネントからエンティティを構築します。

using UnityEngine; 

public abstract class Character : MonoBehaviour 
{ 
    public int HitPoints { get; set; } 

    public virtual void ChangeHP(int amount) 
    { 
     HitPoints += amount; 
    } 

    void OnCollisionEnter(Collision other) 
    { 
     if (other.gameObject.CompareTag("DeathTrigger")) 
     { 
      Die(); 
     } 
    } 

    protected virtual void Die() 
    { 
     Debug.Log("I'm dead."); 
    } 
} 

public class LordOfTerror : Character 
{ 
    protected override void Die() 
    { 
     base.Die(); 
     Debug.Log("But I also come back from the dead very soon."); 
     HitPoints = 100; 
    } 
} 

しかし、プログラミングのこの種は、わずかな継承ツリーのために働き、わずか数制限または回避策を使用すると、ユニティにに慣れるしなければならないことは事実です。一般的に、可能な限りコンポーネントを使用することは理にかなっています。

using System; 
using UnityEngine; 

public abstract class StatAttribute 
{ 
    public int current; 
    public int min; 
    public int max; 

    public void Change(int amount) 
    { 
     current += amount; 
    } 
} 

public sealed class Health : StatAttribute 
{ 
    public event Action tookDamage; 

    public bool isAlive 
    { 
     get { return current > min; } 
    } 

    public void Damage(int amount) 
    { 
     base.Change(-amount); 
     // also fire an event to make other components play an animation etc. 
     if(tookDamage != null) 
      tookDamage(); 
    } 
} 

public sealed class Speed : StatAttribute 
{ 
    public int boost; 

    public int GetFinalSpeed() 
    { 
     return base.current * boost; 
    } 
} 

通常、ゲームオブジェクトにアタッチされた個々のコンポーネントから始めます。すべての組み合わせはあなたの文字を構成します。あなたの通知がそのコードが重複しているいくつかの点でなど健康CharacterMovementPlayerInputアニメーション、のようなものを持っており、これはコンポーネント間の特定の基底クラスを共有するのは意味があります場所です。

+0

* "オブジェクト指向プログラミングの概念はUnityでもうまく使えます" *コンポーネントを書くために(現在)使われている言語は、もちろんOOです。つまり、エンジニアとして、3つのコンポーネント(別名ビヘイビアー)を記述することになります。もちろん、熟練したOOプログラマであれば、OOのプリンシパル(c#で)を使ってこれらのコンポーネントを書くことができます*。しかし、私が私の答えで言及したように、UnityはPhotoshopやSpreadsheetを使っているのと似ています.... – Fattie

+0

実際、ここ2番目の例の@xarは正確に... OOはコンポーネント(別名ビヘイビア) 。その後、Unity(Photoshopやスプレッドシートのようなもの)では、それらを貼り付けるだけです。 (非常に典型的な例です...あなたは様々な発射体を持っていると言いますが、それらはすべて**飛ぶことができます**それらを動かすためのコルーチンがありますので、滑空、速攻、原点、放物線、ズーム...あなた知っている。) – Fattie

+0

私はあなたが言っているものを得る。最初はUnityプロジェクトでどんな種類の継承も使用できないと言っていたように聞こえました。しかし、Unityの側面自体は、古典的なOOよりも全体的に異なるアプローチであると私は同意します。 – Xarbrough

関連する問題