Qemelly(けめる)のプログラム備忘録

Unity / AtCoderについて書きます

Image等のuGUIをドラッグドロップ後に取得したいとき

IEndDragHandlerを実装する。

private Vector2 _startPosition;

public void OnEndDrag(PointerEventData eventData)
{
    transform.position = _startPosition;

    var rayResult = new List<RaycastResult>();
    eventData.position = Input.mousePosition;
    EventSystem.current.RaycastAll(eventData, rayResult);

    if (rayResult.Count == 0)
    {
        Debug.Log("None");
        return;
    }

    foreach (var res in rayResult)
    {
        res.gameObject.TryGetComponent(out IFooInterface foo);
        foo?.DoSomething();
    }
}

Circla制作終了時点から振り返る開発の反省点【ゲーム2作目】

はじめに

本記事は、けめる2作目のゲーム作品となるCirclaの開発全般を振り返り、その反省点をまとめることで、自身の制作をより効率的にしようと試みる記事です。

unityroom.com

※読み手のことは考えてません。ほぼ自分用です。

クラス設計

時間かけすぎ

今作では、クラス設計に数時間を費やしてから開発をスタートしました。

2作目でまだ不慣れなことも大いに影響しているはずですが、もうちょっとラフな設計だけして取り掛かった方が良かったように感じました。

結局予定とは違う設計になってしまう部分が多く、少し無駄だったように感じます。

SOLIDが意識しきれていなかった

SOLID原則を守ることが大変なことを改めて理解しました。

Single Responsibility

  • ❌クラスの責務を大きくしすぎてしまい、後から困るケースがあった
    • 音ゲーの判定、ノートの生成、ノートの削除等を1つのクラスに任せたが、ちょっとデカすぎた
      • 後からRotNote(WASDで拾うノーツ、アーツ)を追加した際、結局同じようなコードを書くことになってしまった→RotNotePresenterの誕生
  • ❌オーディオ関連の処理が一元化されておらず、あちこちのPrefabに紐づけてしまったため、管理が面倒だった
    • ✅ViewにSoundをすべて任せるべき(SetCurrent()OnEnable()部分で音を再生するようにするなど)

Open/Closed Principle

  • ❌とにかく守れてなかった

    • Judgements,Records,Presenter,etc...
      • Judgements,Recordsを途中で直せたのは偉かった(この記事の内容)
    • 「守れない=バグ」と言っても過言ではないということを理解した
  • ⭕️Modあたりの設計はかなり良かったと思う

    • 開発終盤にOCPに注意できてよかった
  • ❌なんでもかんでもenumにして痛い目見た

    • enumとswitchの合わせ技はもっと慎重に!

DI

  • ⭕️自前でやったけど悪くは無かった
  • ❌もうちょっとMonoBehaviourに依存してもいいクラスもあった(一々DIするほどでもないやつ)

バグ

UniRx, UniTaskの購読破棄ができてない系

  • ❌すごく多かった
    • C#クラスにIDisposableは絶対実装する!ちゃんと適切なタイミングで破棄する!

input関連

  • [Menu] 同時押しで音が増えるバグ
    • ✅ストリームをMerge()して解決
  • キーボードとマウス操作を両立させるのが結構面倒だった→適当に実装してバグだらけに
    • ✅パッケージレベルでUI集みたいなのを作ってもいいかも
  • performedよりstartedの方が良かった?(要調査)
  • ❓そもそもUniRxのObservableでinputをラップする必要は薄かったかも
    • 同時押し対策等はUniRxだと楽だが...それ以外は要らなかったかも

以下編集中...

ノートの判定関連

シーン遷移系

ビジュアル(UI, アニメーション)

UX

音楽

2レーン高難易度リズムゲームCirclaを公開しました!

この度unityroomにて2レーン高難易度リズムゲームCirclaを公開しました!

unityroom.com

ゲーム画面1

ゲーム画面2

ゲーム画面3

かなり視覚的に難しい音ゲーに仕上がっております。

新曲もすこーしずつ増やしていこうと思いますので是非プレイしてみてください~

Version1.0現在の曲はbandcamp or YouTubeにて視聴できます!

qemelly.bandcamp.com

www.youtube.com

uGUIやSpriteの色が変わらないときに確認すること

  • Alphaが0になってないか
  • new Color(255, 255, 255)みたいなことしちゃってる
    • Colorの各値の上限は1なので絶対に白が出力されちゃう
  • System.Drawing.Colorとかの間違ったColorを参照してないか