Game A Week三週間目終了 や↑ったぜ!!
Game A Week三週間目終了しました。
Unityroomの週間ランキングに下のほうだけど載っててや↑ったぜ!!
ゲームのコンセプト
- パズルゲームを作りたい。
- マウス操作(タッチ)で楽しめるゲーム
- 前回(Unityroomに載せなかった前作)はプログラミングを重視してゲーム性皆無のゲームができてしまったので、今回は両方ほどよく
今回良かったところ
- ステージを増やしたり改良すればちゃんとしたゲームになると思う。
- 最初に作ったSTGより面白いと言ってくれる人が多かった。
- 3度目だからか余裕をもって制作できたので考える時間も取れた。
- もう一度言うがUnityroomの週間ランキングに載っててや↑ったぜ!!
今回の悪かったところ
- 適当にSoundManagerを作ったせいでステージを作るたびに設定しないといけない・・・作り直すかMaster audio買うかどうするか。
- ギミックのできがよくない。
- 線を引くということの自由度が高すぎて難易度調整が難しい。
- 実は一つ直せていないバグがある、しかもそこそこやばい。
最後に
良くない部分もあったが今回は満足!!
ボクセル楽しい。
Blenderフリーズした悲しい。
コガナズとUnityを使ってみよう Area Effector 2d編【4コマ】
4コマにしてみました
かなり説明不足感がありますがこれを見てArea Effector 2dに興味を持ってくれたらええなあくらいの気持ちで書きました。
はじめての4コマ漫画です。
今更だけどあけましておめでとうございます。+Game A Week二週間目の反省点
あけましておめでとうございます。
去年は一本しかゲームを公開できなかったのですが、今年は質も数も上回っていきます。
Game A Week二週間目UnityroomにUPしようと思っていたのですが・・・
あまりにも出来が悪かったので知り合いにのみ公開としました。
ゲーム内容は右から流れてくるチーズをとるゲームです。
反省点
- Camera.main.ScreenToWorldPointで座標指定後Vector3.MoveTowardsで移動させたがなんだか変に慣性が働いてて操作感が悪かった。 誰か原因わかる人いたら教えてください。
- チーズ(コイン)を一定数ランダム生成してとっていくだけで面白くなかった。
- ほんとうはチーズをとるごとに少しづつ速度が上がるようにしたかったがうまくいかなかった。
- スケジュール管理がガバガバ
UnityでScene遷移とButtonの使い方(初心者向け)
今回はScene遷移(移動)とButtonの使い方をできるだけわかりやすく書いていくで!!
まずはSceneを二つ用意(今回はTitleSceneとBattleSceneを用意)
FileをクリックBuild Settingsを選択さきほど作成した、TitleSceneとBattleSceneをScene In Buildに追加します。
次にButtonをヒエラルキー上から画面に配置します
(CanvasとEvent Systemは自動で配置されます)
次はやりやすいようにCanvasからScreen Space - OverlayからScreen Space - Cameraに変更し
Render CameraにMain Cameraをアタッチ
ではシーン移動をするために赤枠のCreateをクリックし、その中のC# ScriptをクリックしSceneControllerスクリプトを作成するで
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します。(オブジェクト名はなんか自分がわかりやすいので
hierarchy上のButtonのOn Clickにさっき作成したTitleSceneToBattleSceneオブジェクトをアタッチ、SceneControllerからButtonClicked()メソッドを選択
や↑ったぜ!!
何か間違いやわかりにくところがあったらコメント下さい。
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"));
・・・公式のドキュメントがかなり充実してて無料版書くことないぞ!?
今度翻訳でも挑戦してみたいです。
ボスやモブ妖精で使ったDO Tween Pathについて書いていきます。
Tween Options
- Duration そのままだと移動時間を決める欄なのですが、今回はSpeedBasedにチェックを入れている(緑になっている)ので、動作時間ではなく移動スピードをここで設定しています。
- Delay 言葉の通り遅延時間です、今回はスポンしたらすぐ動かすので0にしています。
- Ease これは移動に緩急をつけています。種類が多いのでわかりにくいのですが、その分応用が利きます。
- Loops 文字通りループです。何故100回もループする設定にしてる今になると全くわからん。
Path Tween Option
画面に映っているのがPath(赤い線がPath)です。
- Path Type Catmull Romはフランドールが写っている画像のように丸みのおびた動きになり
LinerというPath Typeは、画像のモブ妖精のような直線的なPath Typeです。(Pathの赤が見づらくてごめんなさい)
STG舞台裏
- Close Path フランドールの時はチェックを入れて、通り過ぎる動きの妖精ではチェックは切っています。
DOTween Proには無料版と違い、DO Tween Pathや今回は使用してないので紹介できませんでしたが、他にもDO Tween Animationという便利なビジュアルエディターや、TextMesh Proとの連携機能があるのでセールの時にぜひ
DO Tween PathのおかげでGame A Weekをどうにか乗り切れたぜ・・・
UniBulletHellってアセットをSetActiveを使ってボスパターンっぽくしてみるで
UniBulletHell
ボスパターンについてのスクリプトと、型変換(キャスト)については下に書いてあります。
今回作ったナズーリンチーズ防衛戦で使いました
雑魚妖精が撃つ全方位に一斉に発射するよく見る弾幕
これは一番上の画像で円形の弾幕を撃っているYellowFairyの設定です
私はShotManagerを作りその中に、Ubh Shot CtrlというUniBulletHellのスクリプトをアタッチして使っています(YellowFairyにUbh Shot Ctrlをアタッチしても問題ありません)
- Start On Awake Delay 何秒後に攻撃を開始するか指定
- LoopとRandomはその名の通り
- Shot ListはSizeを2に変更すると弾幕パターンを複数セット
など一通りのものがそろっています
Shot Listを使えば大体のことはできるけど
なんかたんねえよなあ?
ということで体力が減ると行動と弾幕の種類を変えるスクリプト書いていきま↑す↓
第一形態 やられててウケル
第二形態 形態とか書いてるくせに見た目は変わりません!!
第三形態
第四形態みたいな感じにできるスクリプト書いてみたので今から書きます。
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を下に貼っておきます }
キャストについて
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完成!!
完成!! や↑ったぜ
このゲームのコンセプト
東方のナズーリンがメインのシューティングゲームを作ろうと思った。
良かったところ
- ナズーリンを遊具に乗せたいとかいうふざけたノリで始めたが真面目に作ったおかげでプログラミング力は一週間前よりかなり向上した
- 初日にわからなかったことが最終日にはできるようになっていたり進歩がわかりやすい
- ゲームを一本作るのは達成感あってサイコー
- 今回は一週間という制約があってできなかったがこうすれば改良できるんじゃないか?などなどいっぱい
悪かったところ
一週間という期限もあるしはじめての自作ゲームで手際が悪かったり一週間でどのくらい作れるかわからなかった
- ステージが一つしか作れなかった
- 低速移動の実装が間に合わなかった
- ボムの実装も間に合わなかった
- 書いたのに使えていないキャラや弾が少なくない
- 戦闘中の会話を実装したかったが難しくてできなかった。。。悲しい
やっぱり一番ひどいのは余裕ぶっこいてGame a week初日にブログを始めた暴挙 絶対作り終わってからでよかったぞ
Game a week終わったし後はUnityRoomにゲームあげて公開するだけ!公開したらちょっと休んでSteamで積みゲー増やしちゃうぞー や↑ったぜ!