Unityでゲーム作るお(仮)

ノリでブログをはじめたUnity初心者によるゲーム制作メモの予定です。

Game A Week三週間目終了 や↑ったぜ!!

Game A Week三週間目終了しました。

Unityroomの週間ランキングに下のほうだけど載っててや↑ったぜ!!

ゲームのコンセプト

  • パズルゲームを作りたい。

  • マウス操作(タッチ)で楽しめるゲーム
  • 前回(Unityroomに載せなかった前作)はプログラミングを重視してゲーム性皆無のゲームができてしまったので、今回は両方ほどよく

今回良かったところ

  • ステージを増やしたり改良すればちゃんとしたゲームになると思う。
  • 最初に作ったSTGより面白いと言ってくれる人が多かった。
  • 3度目だからか余裕をもって制作できたので考える時間も取れた。
  • もう一度言うがUnityroomの週間ランキングに載っててや↑ったぜ!!

今回の悪かったところ

  • 適当にSoundManagerを作ったせいでステージを作るたびに設定しないといけない・・・作り直すかMaster audio買うかどうするか。
  • ギミックのできがよくない。
  • 線を引くということの自由度が高すぎて難易度調整が難しい。
  • 実は一つ直せていないバグがある、しかもそこそこやばい。
最後に

良くない部分もあったが今回は満足!!
ボクセル楽しい。
Blenderフリーズした悲しい。

今更だけどあけましておめでとうございます。+Game A Week二週間目の反省点

あけましておめでとうございます。
去年は一本しかゲームを公開できなかったのですが、今年は質も数も上回っていきます。

Game A Week二週間目UnityroomにUPしようと思っていたのですが・・・
あまりにも出来が悪かったので知り合いにのみ公開としました。

ゲーム内容は右から流れてくるチーズをとるゲームです。

反省点

  • Camera.main.ScreenToWorldPointで座標指定後Vector3.MoveTowardsで移動させたがなんだか変に慣性が働いてて操作感が悪かった。 誰か原因わかる人いたら教えてください。
  • チーズ(コイン)を一定数ランダム生成してとっていくだけで面白くなかった。
  • ほんとうはチーズをとるごとに少しづつ速度が上がるようにしたかったがうまくいかなかった。
  • スケジュール管理がガバガバ

良かったところ

  • Camera.main.ScreenToWorldPointを理解したおかげで今回のゲーム開発はかなりスムーズに進んでいるし、ゲームとしてもおもしろそう!!


DotTweenの記事の直帰率とセッションが悪いからどうにかしたいなー

次のブログ更新はGame a week三週間目が終了(1月15日)してちょっと休んだら書く、がんばる。
戌年ナズーリン ゲーム内の邪魔してくるNPCとして使う予定?
f:id:lincate:20180112020420p:plain

UnityでScene遷移とButtonの使い方(初心者向け)

今回はScene遷移(移動)とButtonの使い方をできるだけわかりやすく書いていくで!!

まずはSceneを二つ用意(今回はTitleSceneとBattleSceneを用意)
FileをクリックBuild Settingsを選択さきほど作成した、TitleSceneとBattleSceneをScene In Buildに追加します。
f:id:lincate:20171231123311j:plain
次にButtonをヒエラルキー上から画面に配置します
CanvasとEvent Systemは自動で配置されます)
f:id:lincate:20171231115702p:plain

次はやりやすいようにCanvasからScreen Space - OverlayからScreen Space - Cameraに変更し
f:id:lincate:20171231115216p:plain

Render CameraにMain Cameraをアタッチ
f:id:lincate:20171231115214p:plain

ではシーン移動をするために赤枠のCreateをクリックし、その中のC# ScriptをクリックしSceneControllerスクリプトを作成するで
f:id:lincate:20171231120342p:plain

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//ボタンを使用するためUIとSceneManagerを使用ためSceneManagementを追加
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class SceneController : MonoBehaviour {

    // ボタンをクリックするとBattleSceneに移動します
    public void ButtonClicked () {
        SceneManager.LoadScene("BattleScene");
	}
}

ではこのスクリプトをアタッチするために赤枠の中のCreateからCreate emptyをクリックし空のオブジェクト作成し名前をTitleSceneToBattleSceneします。(オブジェクト名はなんか自分がわかりやすいので
f:id:lincate:20171231121604p:plain
hierarchy上のButtonのOn Clickにさっき作成したTitleSceneToBattleSceneオブジェクトをアタッチ、SceneControllerからButtonClicked()メソッドを選択
f:id:lincate:20171231122237p:plain

や↑ったぜ!!

f:id:lincate:20171231125134g:plain

何か間違いやわかりにくところがあったらコメント下さい。

DOTween ProのDO Tween Pathや、Invokeやコルーチンのように使える遅延メソッドについて

ナズーリンチーズ防衛戦の敵の移動で使ったDOTween Proというアセットについて

https://www.assetstore.unity3d.com/#!/content/32416

前半は無料版でも使える遅延メソッドなど便利機能について書いていきますが、
メインはDO Tween Pathと言う有料版でしか使えないビジュアルエディターについてを書いていきま↑す。

Dot tweenを使う場合using DG.Tweening;を宣言します。
// サンプル1: 他のメソッドを一秒後に呼ぶ
DOVirtual.DelayedCall(1, MyOtherMethodName);
// Example 2: ラムダを使いDebugクラスのLogメソッドを一秒後に実行(自信はない)
DOVirtual.DelayedCall(1, ()=> Debug.Log("Hello world"));

引用DOTween - Documentation

・・・公式のドキュメントがかなり充実してて無料版書くことないぞ!?
今度翻訳でも挑戦してみたいです。

ボスやモブ妖精で使ったDO Tween Pathについて書いていきます。

f:id:lincate:20171228151353p:plain

Tween Options
  • Duration そのままだと移動時間を決める欄なのですが、今回はSpeedBasedにチェックを入れている(緑になっている)ので、動作時間ではなく移動スピードをここで設定しています。
  • Delay 言葉の通り遅延時間です、今回はスポンしたらすぐ動かすので0にしています。
  • Ease これは移動に緩急をつけています。種類が多いのでわかりにくいのですが、その分応用が利きます。
  • Loops 文字通りループです。何故100回もループする設定にしてる今になると全くわからん。
Path Tween Option

画面に映っているのがPath(赤い線がPath)です。
f:id:lincate:20171228153159p:plain

  • Path Type Catmull Romはフランドールが写っている画像のように丸みのおびた動きになり

LinerというPath Typeは、画像のモブ妖精のような直線的なPath Typeです。(Pathの赤が見づらくてごめんなさい)
f:id:lincate:20171228155439p:plain

STG舞台裏
  • Close Path フランドールの時はチェックを入れて、通り過ぎる動きの妖精ではチェックは切っています。

DOTween Proには無料版と違い、DO Tween Pathや今回は使用してないので紹介できませんでしたが、他にもDO Tween Animationという便利なビジュアルエディターや、TextMesh Proとの連携機能があるのでセールの時にぜひ

DO Tween PathのおかげでGame A Weekをどうにか乗り切れたぜ・・・

UniBulletHellってアセットをSetActiveを使ってボスパターンっぽくしてみるで

UniBulletHell
ボスパターンについてのスクリプトと、型変換(キャスト)については下に書いてあります。


今回作ったナズーリンチーズ防衛戦で使いました
雑魚妖精が撃つ全方位に一斉に発射するよく見る弾幕
f:id:lincate:20171227203346p:plain
これは一番上の画像で円形の弾幕を撃っているYellowFairyの設定です
f:id:lincate:20171227220456p:plain
私はShotManagerを作りその中に、Ubh Shot CtrlというUniBulletHellのスクリプトをアタッチして使っています(YellowFairyにUbh Shot Ctrlをアタッチしても問題ありません)

  • Start On Awake Delay 何秒後に攻撃を開始するか指定
  • LoopとRandomはその名の通り
  • Shot ListはSizeを2に変更すると弾幕パターンを複数セット

など一通りのものがそろっています
f:id:lincate:20171228105014p:plain

Shot Listを使えば大体のことはできるけど

なんかたんねえよなあ?

ということで体力が減ると行動と弾幕の種類を変えるスクリプト書いていきま↑す↓f:id:lincate:20171227203349p:plain
第一形態 やられててウケル
f:id:lincate:20171227203350p:plain
第二形態 形態とか書いてるくせに見た目は変わりません!!
f:id:lincate:20171227203352p:plain
第三形態
f:id:lincate:20171227203355p:plain
第四形態みたいな感じにできるスクリプト書いてみたので今から書きます。

public class BossManager : MonoBehaviour {

    //percentageHp変数を作るためにbossHpとbossHpMaxを宣言しています
    public int bossHp;
    public int bossHpMax = 3000;

    //○○○○FormにはShotManagerをアタッチしています
    public GameObject firstForm;
    public GameObject secondForm;
    public GameObject thirdForm;
    public GameObject fourForm;
    public GameObject fiveForm;

    void Start () {
        //bossHpはbossHpMaxの数値を代入しています。
        bossHp = bossHpMax;
        displayBossHp = bossHp;
    }

	void Update () {
        
//今回はpercentageHpがfloatなのでint型であるdisplayBossHpを、
//(float)displayBossHpと書きfloatに変換(キャスト)します
//キャストに関してはコードの終わりに書いておくのでわからない人は読んでね
        float percentageHp = (float)displayBossHp / bossHpMax;
//percentageHpが80%より大きい場合shotForm1()メソッドを呼び出します
        if (percentageHp > 0.8f)
        {
            shotForm1();
        }
//percentageHpが60%より大きい場合shotForm2()メソッドを呼び出します
        else if (percentageHp > 0.6f)
        {
            shotForm2();
        }
//percentageHpが40%より大きい場合shotForm3()メソッドを呼び出します
        else if(percentageHp > 0.4f)
        {
            shotForm3();
        }
//percentageHpが20%より大きい場合shotForm4()メソッドを呼び出します
        else if (percentageHp > 0.2f)
        {
            shotForm4();
        }
//percentageHpが20%以下になるとshotForm5()メソッドを呼び出します
        else
        {
            shotForm5();
        }
    }
//percentageHpが80%より大きいときにこのメソッドは呼び出されます
    void shotForm1()
    {
        //firstFormがtrue(有効化)されます
        firstForm.SetActive(true);
    }

    void shotForm2()
    {
        //firstFormがfalse(無効化)secondFormがtrue(有効化)されます
        firstForm.SetActive(false);
        secondForm.SetActive(true);
    }

    void shotForm3()
    {
        secondForm.SetActive(false);
        thirdForm.SetActive(true);
    }
    void shotForm4()
    {
        thirdForm.SetActive(false);
        fourForm.SetActive(true);
    }
    void shotForm5()
    {
        fourForm.SetActive(false);
        fiveForm.SetActive(true);
    }
}
    private void OnCollisionEnter2D(Collision2D collision)
    {
      //別記事でダメージ処理について書いたのでURLを下に貼っておきます
    }

当たり判定とダメージ処理を追加する - Unityでゲーム作るお(仮)

キャストについて

int型bossHpが元であるdisplayBossHpもint型なので、float percentageHpに代入したい場合
float percentageHp = displayBossHp / bossHpMax;
と書いてもdisplayBossHpをfloatに暗黙の型変換ができず(正しく処理されない)1ダメージ減っただけでshotForm5()を呼び出されてしまいます。

これを回避するためにはdisplayBossHpをfloat型に変換します
float percentageHp = (float)displayBossHp / bossHpMax;
上記ようにdisplayBossHpの前に(float)と書くことで、displayBossHpをintからfloatに明示的な型変換(キャスト)できます。

間違いや分からないところがあったらコメントしてください



Game a week中は全く気付かなかったけどshotFormメソッドは、SwitchでもできるしぶっちゃけSwitchとかで書いたほうが短くなるしよさそう

ブログにコード載せるわけだし。リーダブルコードって本読んでみようかな

今回スクリプトは載せていないのですが、フランドールのHPケージはこちらのサイトを参考にしています。
C# - HPがちゃんと満タンにならない【(int)Mathf.Lerp】の加算問題(89433)|teratail

Game A Weekどうにか間に合いSTG完成!!

f:id:lincate:20171227203343p:plain

完成!! や↑ったぜ

このゲームのコンセプト

東方のナズーリンがメインのシューティングゲームを作ろうと思った。

良かったところ

  • ナズーリンを遊具に乗せたいとかいうふざけたノリで始めたが真面目に作ったおかげでプログラミング力は一週間前よりかなり向上した
  • 初日にわからなかったことが最終日にはできるようになっていたり進歩がわかりやすい
  • ゲームを一本作るのは達成感あってサイコー
  • 今回は一週間という制約があってできなかったがこうすれば改良できるんじゃないか?などなどいっぱい

悪かったところ

一週間という期限もあるしはじめての自作ゲームで手際が悪かったり一週間でどのくらい作れるかわからなかった

  • ステージが一つしか作れなかった
  • 低速移動の実装が間に合わなかった
  • ボムの実装も間に合わなかった
  • 書いたのに使えていないキャラや弾が少なくない
  • 戦闘中の会話を実装したかったが難しくてできなかった。。。悲しい

やっぱり一番ひどいのは余裕ぶっこいてGame a week初日にブログを始めた暴挙 絶対作り終わってからでよかったぞ


Game a week終わったし後はUnityRoomにゲームあげて公開するだけ!公開したらちょっと休んでSteamで積みゲー増やしちゃうぞー や↑ったぜ!
f:id:lincate:20171227203352p:plain