主なコンテンツ

〜主なコンテンツ〜

1. Unityで製作したゲームと製作Tips
  1. 三月精チャレンジ(東方Project二次創作)
    1. 作り方
  2. 英語学習2D(オリジナルスマホアプリ)
2. UE4
3. ゲームアプリ見学
4. Bitbucket & SourceTreeでの一連の流れ
  1. 前半
  2. 後半
5. Tips
  1. UnityのTips
  5. SQL文のTips
  6. Final IK
  7. GearVR+Unity

2016年3月11日金曜日

アイテムクラスの設計改善【三月精チャレンジ】

■継承( C#)

  • やったこと

    • アイテムが回転する動作など、どのアイテムにも共通する処理は基本クラスにした
    • アイテムを取ったときの処理は派生クラスで行うようにした
    • アイテム取得時の音の処理はアイテムスポーンクラスに行わせることにした(常にHierarchyにいて、且つアイテムクラスが参照するため)。こういった共通処理に手を加えたいときに、基本クラスを修正するだけで良くなった。

  • スクリプトについて

    • 拡張の際は、base. 関数で基本クラスの処理を呼び出す。したがって、拡張したい基本クラスの関数はpublicprotectedにする必要がある。
    • 派生クラスで拡張する関数はnewを使うかoverraideを使うか悩んだが、後者のほうが多そうだったので後者にした(>>newとoverraideの違いはこちらの記事参照
    • オーバーライドする場合は、基本クラスと派生クラスのアクセス修飾子を一致させる必要がある(>>同様にこちらの記事参照
    • 拡張の際は、アクセス修飾子やbase. 関数の書き忘れが多かった

■スクリプト(基本クラス)

using UnityEngine;
using System.Collections;
public class ItemBehaviour : MonoBehaviour {
private SpawnManager spawn; //<! SpawnManagerで設定
protected GameObject manager;
// 派生先で処理を拡張する
protected virtual void Start () {
//HierarchyからManagerを見つける
manager = GameObject.FindWithTag("Manager");
}
// Update is called once per frame
void Update () {
//回転の演出
transform.Rotate(Vector3.up, 5, Space.World);
}
//InstantiateしたSpawnManagerを受け取る
public void SetSpawnManager(SpawnManager spaMan){
spawn = spaMan;
}
void OnTriggerEnter(Collider other){
//Playerタグを持っているか確認
if(other.tag == "Player"){
GetItem ();
}
}
protected virtual void GetItem(){
//対応するスポーンのカウンターを減らす
spawn.counter--;
//SEを鳴らす
spawn.PlaySE();
//このオブジェクトを破壊
Destroy (gameObject);
}
}

■スクリプト(派生クラス)

using UnityEngine;
using System.Collections;
public class CoinBehaviour : ItemBehaviour {
public ParticleSystem parSys;
public int score = 10;//<! コインによる獲得スコア
private GameObject [] characters = new GameObject[3];
private int gettableIndex = 0;//<! コインを入手できるキャラクターのindex。objectNamesに対応。
private ScoreManager scoreManager;
protected override void Start(){
//基本処理の呼び出し
base.Start ();
//基本クラスで取得済みのmanagerから必要なコンポーネントを取得
scoreManager = manager.GetComponent<ScoreManager>();
//現在のキャラクターの取得
GameObject player = GameObject.FindWithTag("Player");
Transform chaTra = player.transform.Find("Character");
characters[0] = chaTra.Find ("SunnySD").gameObject;
characters[1] = chaTra.Find ("LunaSD").gameObject;
characters[2] = chaTra.Find ("StarSD").gameObject;
//コインを入手できるキャラクターをランダムで決定
gettableIndex = Random.Range (0, characters.Length);
//パーティクルの色を変える
SetCollor(gettableIndex);
}
void SetCollor(int index){
//インデックスに応じてパーティクルの色を変更
switch(index){
case 0:
parSys.startColor = Color.red;
break;
case 1:
parSys.startColor = Color.white;
break;
case 2:
parSys.startColor = Color.blue;
break;
}
}
protected override void GetItem(){
//アクティブならアイテム入手の処理を行う
if (characters[gettableIndex].activeSelf) {
//基本処理の呼び出し
base.GetItem();
//スコアの処理
scoreManager.GetScore(score);
}
}
}

0 件のコメント:

コメントを投稿