ぐていブログ

主にUnityゲーム開発関連のことを書きます。特に2Dに力を入れたい。

【Unity】Unity1Week お題「あつまる」に遅刻参加した話【Unity1Week】

今回は体調を考慮して、毎日2時間以内を目標に開発してた結果13日間かかりました。
unityroom.com

環境

Unity2018.4.0f1
macOS Mojave 
VSCode1.36.1 
Aseprite

作ったもの

今回のお題は「あつまる」。
完成したゲームはこんな感じ

ロボットの墓場でバラバラになったパーツを集めて命を与える…

unityroom.com

主人公のネズミ(狐に見えんでもない)
f:id:g00d_taste:20190714132848g:plain

完走した感想

絵が不自由なく書けたらなと毎回思いますねえ。
1枚書くのに時間はかかるし、クオリティも低い。
想像してるものを描き起こす技術がないもどかしさよ。

1日の作業量を分散

今回は前述した通り体調を考慮して、1日の作業量を分散して開発を進めてみました。
作業時間の管理はTogglでやりました。タイマーのオンオフさえ忘れなければいいサービスです(忘れる)

toggl.com

このやり方で良かったこと、悪かったことあったのでなんとなく列挙してみます。

よかったこと

  • 1日に集中してないので気楽に続けられた
  • 間に合うとも思えてなかったので一応の締切も気にせずに進めた
  • 作業中に気づかなかったことが、離れてから思いついたりすることがあった
  • あまりやる気のない日でも長くて2時間でいいんだと思うと取り掛かりやすかった。実際30分しか作業してない日もあった。

悪かったこと

  • 次の日には何をやっていたのか微妙に忘れている
  • 昨日やりたかったことと今日やりたいことが違うので、作業箇所が分散し、進捗が遅く感じられた
  • 集中してきたって時も2時間きたら中断したので、1日の進捗は確実に悪い

自分の中での結論

体調がいいのなら、1日に3〜4時間くらい使えると良さそうと思った。

Togglでのレポート貼っておきます。
2時間超えてる日もあるけど、最終的に平均2時間弱に収まったからセーフ。

f:id:g00d_taste:20190714132023p:plain
後半やたらやっちゃってる

企画書

スプレッドシートで作成しました。
何かのヒントになればと思い一部公開してみます。(所詮プログラマが書く企画書って感じですが)
↓こんなかんじで企画列を思いつくままに列挙して、必要な機能などを書いていくといった感じで進めました。

f:id:g00d_taste:20190714130405p:plain
一部

クラス設計

最初に設計してあとはあまりメンテせず。
結局いろいろなものが依存しまくった状態で終わってしまったが、関係性の可視化はいいことだと思っていて、最近は書くようにしてます。
拙いものですが色々なレベルのものが参考になったりするので、これも公開してみる。

@startuml Classes
left to right direction
namespace Input{
    interface IInputProvider{
        IObservable<Vector2> axisInputAsObservable;
        IObservable<Unit> commonInputAsObservable;
        IObservable<Unit> AxisNewtralInputAsObservable { get; }
        void Initialize();
    }
    class InputFromKeyBoard
    InputFromKeyBoard..|>IInputProvider
}

namespace Player{
    class PlayerCore{
        +Dictionary<PartsType,PartsInfo> currentPickedPartsList;
    }
    class PlayerMover
    class PlayerAnimator

    PlayerCore..>PlayerMover
    PlayerCore..>PlayerAnimator
    PlayerCore-->Input.IInputProvider
    PlayerCore-->Parts.IPickable
}


class GameManager

GameManager..>Player.PlayerCore
GameManager..>Parts.PartsManager
GameManager..>Robo.RoboManager

class BoundCamera
class FollowTarget
FollowTarget..>Player.PlayerCore

namespace Parts{
    enum PartsType
    class PartsInfo {
        +PartsType type
        +int id
        +int grade
        +string name
    }
    class PartsManager
    class PartsFactory{
        +BaseParts create(RoboInfo _roboInfo);
    }
    class BaseParts{
        4つセットで作られる
    }
    interface IPickable{
        +PartsInfo Info {get;}
        +void OnPick()
    }
    ' PartsManager..>Player.PlayerCore
    PartsManager-->PartsFactory
    PartsFactory-->BaseParts
    BaseParts..|>IPickable
    PartsManager-->Robo.RoboManager

}

namespace Robo{
    class RoboManager{
        +List<RoboInfo> list;
        +void Gattai(Dictionary<PartsType,PartsInfo> _pickedPartsList)
        +IObservable<RoboInfo> GekitotuAsObservable
    }
    class RoboInfo{
        +int id
        +Dictionary<PartsType,RoboPartsInfo> dic
    }
    class RoboPartsInfo{
        +PartsInfo partsInfo
        +Vector2 RelativePos
    }

    class RoboFactory{
        +BaseRobo Create(RoboInfo _info)
    }
    class BaseRobo {
        +IObservable<RoboInfo> GekitotuAsObservable
    }
    RoboManager..>Player.PlayerCore
    RoboManager-->RoboFactory
    RoboFactory-->BaseRobo

}

namespace UI{
    class PicedPartsFrame
    PicedPartsFrame..>Player.PlayerCore
}

class Money


@enduml

f:id:g00d_taste:20190714131117p:plain
酷い出来である(実際のコードは更に酷い)

技術的な話

特に新しいことはしてないですが、今回はレイヤーを結構分けて当たり判定に利用しました。

f:id:g00d_taste:20190714133604p:plain

あとはPhysics2D.OverlapCircleAllを使って範囲内のものを一斉取得して処理するということをしました。
爆発とパーツの取得時に使用。

docs.unity3d.com

最後に

前回のUnity1Weekは評価制度が導入されたこともあって、気を張って臨んでしまった感じがあったので、投稿後も評価気にしたりしてちょっと疲れちゃったんですよね。
だから今回は気楽に自分の作りたいものだけに集中して取り組もうと思って始めました。
結果大遅刻ですが、だいたいやりたかったことを実装できたし、自己満足のいくUnity1Weekになったと思います。
諸事情でプログラマとしてはゲーム開発から少し離れていくことになるかもしれませんが、このイベントだけは余裕を見て参加したいなと思ってます。

【Unity】Edit Colliderのサイズ調整ハンドル(ポッチ?ドット?)が出ない話【Edit Collider】

f:id:g00d_taste:20190527135658p:plain
なんか足んねぇよなぁ?

f:id:g00d_taste:20190527135605p:plain
理想形

なんででしょうねえ?

環境

Unity2018

原因

Inspectorビューが複数ある状態だと出ない模様。

answers.unity.com

解消方法

  1. Inspectorビューを一つになるまで減らす。
  2. UnityEditorを再起動する。

Inspectorビューを減らしただけではハンドルは出ないので再起動までセットで。

感想

最近ハンドル出ないなーって思ってたけど、こんな理由だったんですねえ。
しかし、Inspectorビュー複数ある状態って便利だから困っちゃうなぁ。

【Unity】[Inject]でCS0649警告が出るのを消したい【VSCode】

[Inject]で宣言した変数を初期化せずに使おうとするとエラーにはならないが警告が出ちゃうから消したいね。
CS0649警告へのちゃんとした対策は先駆者様が丁寧丁寧丁寧な記事を書いてらっしゃるので、そっちを見ようね。
これはInjectでの警告に絞った記事になっております。

環境

Unity2018.3.11f1
macOS Mojave 
VSCode1.33.1

警告が出そうなソース例

using UnityEngine;
using Zenject;

public class Test : MonoBehaviour
{
    [Inject] private GameParameters gp;
    [Inject(Id = DragType.Angle)] private IDragObservable dragAngle;
    void Start()
    {
        Debug.Log($":{gp}");
        Debug.Log($":{dragAngle}");
    }
}

f:id:g00d_taste:20190505095208p:plain
でたぁ!

回避策

こちらの記事を大いに参考にさせていただきまして qiita.com

defaultで初期化する回避策を拝借しまして、正規表現文字をInject用に弄りました。

正規表現検索
検索文字: (\[Inject[^\]]*\])([^=]+?);

・置換
置換文字: $1$2 = default;

f:id:g00d_taste:20190505095243p:plain
置換風景

感想

[Inject] を使う時は初期化も心がけよう(戒め