unity1week「ちゅう」のゲームで実装したイベントアニメーション【unity1week,Unity】

今回プロなろというグループでチーム開発を行いました!

ジャンプキングに似たやりこみのあるゲームになっています

Repositoryは公開しているので,細かい実装はRepositoryを参照ください

github.com

(注) : 実装説明により一部ゲームのネタバレ等含みます

開発環境

  • Unity 2020.3.17f1
  • Github(主にCI/CD用)

使用アセット(関連するもののに記載)

UPM

Asset Store

イベントアニメーション

各画面のイベントアニメーション

各画面にて以下のようなゲームイベントが存在します

これらを実装するために,以下を採用しました

タイトルの背景アニメーション f:id:ayousanz:20210915212114g:plain

ゲーム開始時のアニメーション(ゲーム画面) f:id:ayousanz:20210915213622g:plain

ゲームクリア時のアニメーション(ゲーム画面) f:id:ayousanz:20210915214430g:plain

クリア画面の背景アニメーション f:id:ayousanz:20210915213107g:plain

ゲームオーバー画面のアニメーション f:id:ayousanz:20210915213319g:plain

実装方法

こちら基本的には DOTweenを 以下の方法で使用してイベントアニメーションを再生しています

  1. Sequenceを生成して,任意のところで再生
  2. trasform.DO~をUniTask型に変換して,awaitで前の処理が終わるまで待機

タイトルは Sequenceで実装しているので,以下のように実装しました

_sequence = DOTween.Sequence()
                .Append(transform.DOJump(new Vector3(3.65f, _firstYPosition, 0f), 0.3f, 10, 10f))
                .AppendCallback(() => characterDialogue.SetView(true).Forget())
                .AppendCallback(() => _rigidbody2D.bodyType = RigidbodyType2D.Dynamic)
                .Append(transform.DORotate(new Vector3(0f, 0f, 360f), 5f, RotateMode.FastBeyond360))
                .AppendCallback(() =>
                {
                    characterDialogue.SetView(false).Forget();
                    //ループ対応
                    Reset();
                });

            _sequence.Restart();

ゲームの開始時のアニメーションはDOTweenをawaitしています

        public async UniTask StartEvent()
        {
            await FallHole();
            await SetStartPosition();
            await Conversation();
        }
        
        private async UniTask FallHole()
        {
            player.DORotate(new Vector3(0f, 0f, 360f + 180f), 5f, RotateMode.FastBeyond360);
            await player.DOMoveY(-911f, 5f).ToAwaiter();
        }

        private async UniTask SetStartPosition()
        {
            player.DOJump(new Vector3(-45f, -900f, 0f), 200f, 1, 3f);
            await player.DORotate(new Vector3(0f, 0f, -180f), 3f).SetRelative(true).ToAwaiter();
        }

        private async UniTask Conversation()
        {
            await playerCharacterDialogue.SetView(true);
            playerCharacterDialogue.SetContent(firstConversationContent[0]);
            await UniTask.Delay(TimeSpan.FromSeconds(WaitBetweenConversationTime));
            playerCharacterDialogue.SetContent(firstConversationContent[1]);
            await UniTask.Delay(TimeSpan.FromSeconds(WaitBetweenConversationTime));
            await playerCharacterDialogue.SetView(false);
        }

ゲームのクリア情報のツイート機能

こちらの記事を参考に実装しました

画像のツイートは,できない時とできるときがあり調査時間がなかったため文字のみになりました

unity-senpai.hatenablog.com

クリア時間のランキング機能

unity roomのランキングはnaichiさんが公開されているものを使用させていただきました

時間は 〇分〇秒で表示したかったのでフォーマットを mm:ss に設定しています

blog.naichilab.com

開発運用(CI/CD)

今回の制作ではGithub Actionsを使って,テストとビルドを自動化しました

前に記事を書いたので,そちらを参考にしてみてください

ayousanz.hatenadiary.jp

設計

1週間の期間ですが,設計をある程度意識して実装をしています

UniRx,UniTaskを使ってMV(R)Pで実装をしています

各シーンのクラス図は以下のようになっています

タイトルシーン f:id:ayousanz:20210915220125p:plain

ゲームシーン f:id:ayousanz:20210915220137p:plain

ゲームクリアシーン f:id:ayousanz:20210915220144p:plain

ゲームオーバーシーン f:id:ayousanz:20210915220154p:plain

またフォルダは一応(めっちゃあいまいですが)ドメインごとにわけました f:id:ayousanz:20210915220213p:plain