名古屋でアプリ・VR開発を行っています
ワクワクできるゲームをガンガン開発リリース中!

訓練島!新作!ボクセルパイレーツ

こんにちは、サトコです!
本日リリースした「ボクセルパイレーツ」を早速プレイしてみました!


f:id:sat-box:20200206173720j:plain
f:id:sat-box:20200206173733j:plain


キャラクターを選びます!


f:id:sat-box:20200206173745j:plain


ステージを選んでスタートです!
最初なので訓練島にしてみます!


f:id:sat-box:20200206173802j:plain


ミッションクリアを目指して
敵を倒して武器をひろっていきます!


f:id:sat-box:20200206173827j:plain


敵が2人近づいてきたので攻撃します!


f:id:sat-box:20200206173841j:plain


2人と戦っているうちに
後ろにも敵が…


f:id:sat-box:20200206173851j:plain


後ろから来た下っ端海賊に倒されました…
ミッションクリアできず…
ぜひ皆さんもSAT-BOXの新作で遊んでみてください!
ec.nintendo.com


そして!
「ボクらの消しゴム落とし」追加コンテンツ
”バトルロイヤルパック”配信しておりますので
こちらもぜひご覧ください!
ec.nintendo.com

【Nintendo Switch】【新作】「Voxel Pirates(ボクセルパイレーツ)」が本日リリース!

こんにちわ、SAT-BOXのペンギンです。

 

本日、新作Nintendo Switchゲーム

「Voxel Pirates(ボクセルパイレーツ)」

がリリースされました!

f:id:sat-box:20200123160141j:plain

タイトル:Voxel Pirates(ボクセルパイレーツ)
配信開始日:2020年2月6日(木)
価格:850円(税込み)
プレイ人数:1 ~ 4人

※2月18日(土) 23:59 までは10%OFFの765円で購入できます!

www.youtube.com

今回は海賊がテーマのゲーム内容となっており、港町や船上、海賊団アジトといった様々なステージで遊ぶことができます!

最大4人まで一緒にプレイ可能できるので、みんなでプレイすれば絶対盛り上がりますよ!海の魔物を倒し、高得点をゲットできるのは一体誰なのか!?

f:id:sat-box:20200123160929j:plain

f:id:sat-box:20200123161035j:plain

f:id:sat-box:20200123161054j:plain

f:id:sat-box:20200123161101j:plain

レースモードは、海の上でのレース勝負!

コース取りやアイテムを使うタイミングを見極めて1位を目指そう!

f:id:sat-box:20200123161138j:plain

※購入はコチラから

ec.nintendo.com

ただいまセール中なので、この機会に是非購入してプレイしてみてください!

また、体験版もありますので、購入を迷っている方は、まずは体験版で遊んでみてくださいね!

バトルロイヤル!ボクらの消しゴム落とし

こんにちは、サトコです!
今日は先日配信開始した「ボクらの消しゴム落とし」の
DLC追加コンテンツ“バトルロイヤル”をプレイしてみました!


f:id:sat-box:20200205172037j:plain


クラスみんなで落とし合い
減っていく机から落ちないように生き残りをかけてバトルします!


f:id:sat-box:20200205172049j:plain


いざ!戦いの場へ!


f:id:sat-box:20200205172100j:plain


ミッションもあるのでミッションクリアを目指して
鉛筆とはさみとラグビーボールを探します!


f:id:sat-box:20200205172113j:plain


はさみを見つけました!
と思ったら…


f:id:sat-box:20200205172247j:plain


一瞬で落とされました…


f:id:sat-box:20200205172258j:plain


結果26位でした…
次はもっと生き残れるようにがんばります!
ぜひ皆さんも挑戦してみてください!
「ボクらの消しゴム落とし」をお持ちでない方は
セットでの購入もできますのでぜひお買い求めください!
ec.nintendo.com


そして!
いよいよ明日!
新作Nintendo Switch「ボクセルパイレーツ」がリリースです!
財宝を求め、みんなで海の覇権を競おう!
ぜひこちらもご覧ください!
ec.nintendo.com

ScriptableObjectでデバッグモードのON/OFFを切り替えてみる

みなさん、こんにちは!SAT-BOXのツバメです。

今回は、普段チームで開発している時に使用している自作したデバッグ処理のON/OFF機能を実装方法を紹介しようと思います。
実装理由は、チーム内では個人でデバッグ用の機能を作成する人もいますが、製品版としてゲームをリリースする場合、処理を消すのが面倒なためこの機能を実装しました。

1.なんでScriptableObjectなのか?

大きな理由としては、「共有データとして持つため」「管理が簡単」の2点の理由で使用しています。プログラマー以外の人でも触りやすいというのも一番のポイントですね。

2.さっそく実装!

まず、最初にScriptableObjectとしてデータを持っておく部分の作成をします。

using UnityEngine;

[CreateAssetMenu(menuName = "Debug_ON_OFF_Data")]
public class Debug_ON_OFF_Data : ScriptableObject
{
    public bool debugMode;
}

スクリプトを作成して、上記の処理を追加することで作成できます。
ここにデータを追加すればON/OFFの項目を増やすことができます。

[CreateAssetMenu(menuName = "Debug_ON_OFF_Data")]

この処理でProjectのCreateから作成できるようにもしています。
早速作成してみます!

f:id:sat-box:20200203180357p:plain

このような感じでInspectorに表示されるかと思います。
ここのチェックを切り替えることでデバッグのON/OFFが出来るようになっています。
しかし、これだけだと外部からデバッグがONなのかOFFなのかが分からないので少し処理を書きます。

3.外部からデバッグON/OFFが分かるように処理を作成

using UnityEngine;

public class Debug_ON_OFF : MonoBehaviour
{
    /// <summary>
    /// Debug_ON_OFF_Dataのアセットデータ
    /// </summary>
    private static Debug_ON_OFF_Data asset;

    /// <summary>
    /// ScriptableObjectのデータ名
    /// </summary>
    private static readonly string DATA_NAME = "Debug_ON_OFF_Data";

    /// <summary>
    /// デバッグ種類
    /// </summary>
    public enum DebugType
    {
        /// <summary>
        /// デバッグモード
        /// </summary>
        DebugMode,
    }

    /// <summary>
    /// デバッグ機能のON/OFFを取得
    /// </summary>
    /// <param name="_debugType"></param>
    /// <returns></returns>
    public static bool GetDebugActive(DebugType _debugType)
    {
        // Debug_ON_OFF_Dataを取得
        asset = Resources.Load(DATA_NAME) as Debug_ON_OFF_Data;

        // アセットが無い場合
        if (asset == null)
            return false;

        switch (_debugType)
        {
            case DebugType.DebugMode: return asset.debugMode;

            default: return false;
        }
    }
}

新しくスクリプトを追加して処理を書きました。
やっていることは単純でAssetsからデバッグのデータを取得して、
データがどうなっているかBool型で返しているだけで
す。
これで、外部からデバッグ機能がどうなっているか呼べるようになりました。
static型なので基本どこからでも呼べます。

4.表示方法も頑張るとこうなる

今回はデバッグ機能のON/OFF機能の実装だけを紹介しましたが、
表示もこだわり始めるとこんな感じにできます。

f:id:sat-box:20200203181059p:plain

エディター拡張の[EditorWindow]を使用して実装しています。
どういったものかは皆さんの方で調べてみてください。
(今後のブログで時間があれば書くかもしれないです)

以上、ツバメでした!

長野県大会 決勝戦!机でスキージャンプ

こんにちは、サトコです!
今日は「机でスキージャンプ」の“全国大会”
長野県大会の決勝戦です!!



勝戦はさとこ学校VS佐野商業高校です!
勝って優勝したいです!



1人目の1回目!
125.1m!なかなか良い記録なのでは!



しかし…着地の失敗が続き…
記録が伸びません…



相手は安定して記録を伸ばします…
さとこ学校はその後も着地がうまくできず… 



負けてしまいました…



長野県大会の決勝で敗退です…
ぜひ皆さんも無料アプリですので挑戦してみてください!

机でスキージャンプ
机でスキージャンプ
開発元:SAT-BOX
無料
posted withアプリーチ


そして!
Nintendo Switch「ボクらの消しゴム落とし」DLC追加コンテンツ第二弾!
”バトルロイヤルパック”が配信開始!
「ボクらの消しゴム落とし」とセットでもご購入いただけます!
こちらもぜひご覧ください!
ec.nintendo.com

消しゴムレース!ボクらのスクールバトル

こんにちは、サトコです!
今日は友達と4人で「ボクらのスクールバトル」の“消しゴムレース”に挑戦しました!


f:id:sat-box:20200128160646j:plain


コースを選んでスタートします!


f:id:sat-box:20200128160656j:plain


コースを1周して1番早く戻ってきた消しゴムが勝ちです!
サトコは黄色です!


f:id:sat-box:20200128160725j:plain


赤がスタート地点から脱出できずに苦戦しています…
車の向きがきれいに反対向きに…


f:id:sat-box:20200128160737j:plain


サトコの黄色は障害物にぶつかってなかなか進めません…
赤はなんとか進み始めました!


f:id:sat-box:20200128160747j:plain


サトコが障害物に苦戦している間に…
緑に追い抜かれてしまいました…


f:id:sat-box:20200128160808j:plain


緑がアヒルに足止めされているので
何とか障害物を乗り越えてあと1回でゴールできそうです!


f:id:sat-box:20200128160818j:plain


1位でゴールしました!
ぜひ皆さんも挑戦してみてください!
ec.nintendo.com


そして!
2月6日リリース
新作Nintendo Switch「ボクセルパイレーツ」の
あらかじめダウンロードも行っております!
2月18日まで割引価格でお買い求めいただけますので
ぜひ!こちらもご覧ください!
ec.nintendo.com

Inspectorのリスト型の複数情報の表示を色々と改造するエディター拡張

みなさん、こんにちは!SAT-BOXのツバメです。
最近は、新型コロナウイルスをよく耳にしますね。
SAT-BOXの拠点でもある愛知県でもついに感染者が…。
手洗いやうがい、マスクなどをして感染しないようにみなさんも気をつけてください。

さて、今回はUnityのエディター拡張のお話です。
みなさんは、リスト型の変数は使ったことがありますでしょうか?
個人的に使用頻度の高い変数だと思っています。
リストには、構造型を設定することで複数の情報を設定出来ます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    [System.Serializable]
    public struct EnemyData
    {
        [SerializeField, Header("敵の名前")]
        public string enemyName;

        [SerializeField, Header("HP")]
        public int hitPoint;

        [SerializeField, Header("攻撃力")]
        public int attackPoint;

        [SerializeField, Header("防御力")]
        public int deffencePoint;
    }

    [SerializeField, Header("敵のデータ")]
    private List<EnemyData> enemyData = new List<EnemyData>();
}

f:id:sat-box:20200127172152p:plain
このように複数の情報を扱うことが出来ます。
今回はこのInspectorの表示をエディター拡張を用いて色々と改造してみます。

エディター拡張するためには、拡張できるスクリプトが必要なので
早速作っていきます。今回は使い勝手を良くするため[ReorderableList]を使います。
[ReorderableList]が何なのかというと、
f:id:sat-box:20200127173438p:plain
こちらですね。ProjectSettingsのレイヤーの設定でこちらを確認できます。
配列要素の順番などを自由に変更できる便利な機能です。
では、実際に作成していきます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;

[CanEditMultipleObjects]
[CustomEditor(typeof(Test))]
public class TestEditor : Editor
{
    /// <summary>
    /// テスト用リスト
    /// </summary>
    private ReorderableList testListRL;

    private void OnEnable()
    {
		#region テスト用リスト

		// Test.csにあるリストを取得
		testListRL = new ReorderableList(
			serializedObject,
			serializedObject.FindProperty("enemyData")
		);

		testListRL.elementHeight = 130;

		testListRL.drawHeaderCallback = (rect) =>
		{
			EditorGUI.LabelField(rect, "敵のデータ");
		};

		testListRL.drawElementCallback = (rect, index, isActive, isFocused) =>
		{
			// callbackが呼び出されるときに渡される index を使って配列の要素を取得
			var element = testListRL.serializedProperty.GetArrayElementAtIndex(index);

			// ラベルを描画
			EditorGUI.PropertyField(rect, element);
		};

		#endregion
	}

	public override void OnInspectorGUI()
    {
        serializedObject.Update();

		testListRL.DoLayoutList();

		serializedObject.ApplyModifiedProperties();
    }
}

f:id:sat-box:20200127174746p:plain
以上のコードで描画したものです。構造体のリストだと、複数の情報が存在しているため
このコードだけでは表示できません。
f:id:sat-box:20200127175033p:plain
情報が一つだけだとこのように描画されます。
では、構造体の情報を表示できるようにコードを書いていきます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;

[CanEditMultipleObjects]
[CustomEditor(typeof(Test))]
public class TestEditor : Editor
{
    /// <summary>
	/// テスト用リスト
	/// </summary>
	private ReorderableList testListRL;

    private void OnEnable()
    {
		#region テスト用リスト

		// Test.csにあるリストを取得
		testListRL = new ReorderableList(
			serializedObject,
			serializedObject.FindProperty("enemyData")
		);

		testListRL.elementHeight = 110;

		testListRL.drawHeaderCallback = (rect) =>
		{
			EditorGUI.LabelField(rect, "敵のデータ");
		};

		testListRL.drawElementCallback = (rect, index, isActive, isFocused) =>
		{
			// callbackが呼び出されるときに渡される index を使って配列の要素を取得
			var element = testListRL.serializedProperty.GetArrayElementAtIndex(index);

			// ラベルを描画
			EditorGUI.PropertyField(rect, element);
		};

		#endregion
	}

	public override void OnInspectorGUI()
    {
        serializedObject.Update();

		testListRL.DoLayoutList();

		serializedObject.ApplyModifiedProperties();
    }

	[CustomPropertyDrawer(typeof(Test.EnemyData))]
	public class EnemyDataDrawer : PropertyDrawer
	{
		public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
		{
			using (new EditorGUI.PropertyScope(position, label, property))
			{
				// 要素番号ごとに区切るラベル
				EditorGUI.LabelField(position, label.text + " -----------------------------------------------------------------");

				position.y += EditorGUIUtility.singleLineHeight;
				position.height = EditorGUIUtility.singleLineHeight;
				position.width = 120;

				// propertyから各要素を取得(Serialized)
				var name = property.FindPropertyRelative("enemyName");
				var hp = property.FindPropertyRelative("hitPoint");
				var atk = property.FindPropertyRelative("attackPoint");
				var def = property.FindPropertyRelative("deffencePoint");

				#region 敵の名前のRect

				var nameLabelRect = new Rect(position)
				{
					y = position.y + EditorGUIUtility.singleLineHeight
				};

				var nameRect = new Rect(position)
				{
					x = position.x + 60,
					y = position.y + EditorGUIUtility.singleLineHeight
				};

				#endregion

				#region HPのRect

				var hpLabelRect = new Rect(position)
				{
					y = position.y + EditorGUIUtility.singleLineHeight * 2
				};

				var hpRect = new Rect(position)
				{
					x = position.x + 60,
					y = position.y + EditorGUIUtility.singleLineHeight * 2
				};

				#endregion

				#region 攻撃力のRect

				var atkLabelRect = new Rect(position)
				{
					y = position.y + EditorGUIUtility.singleLineHeight * 3
				};

				var atkRect = new Rect(position)
				{
					x = position.x + 60,
					y = position.y + EditorGUIUtility.singleLineHeight * 3
				};

				#endregion

				#region 防御力のRect

				var defLabelRect = new Rect(position)
				{
					y = position.y + EditorGUIUtility.singleLineHeight * 4
				};

				var defRect = new Rect(position)
				{
					x = position.x + 60,
					y = position.y + EditorGUIUtility.singleLineHeight * 4
				};

				#endregion

				GUI.Label(nameLabelRect, "名前");

				// 敵の名前のフィールドを表示
				name.stringValue = EditorGUI.TextField(nameRect, name.stringValue);

				GUI.Label(hpLabelRect, "HP");

				// HPのフィールドを表示
				hp.intValue = EditorGUI.IntField(hpRect, hp.intValue);

				GUI.Label(atkLabelRect, "攻撃力");

				// 攻撃力のフィールドを表示
				atk.intValue = EditorGUI.IntField(atkRect, atk.intValue);

				GUI.Label(defLabelRect, "防御力");

				// 防御力のフィールドを表示
				def.intValue = EditorGUI.IntField(defRect, def.intValue);
			}
		}
	}
}

f:id:sat-box:20200127180600p:plain
完成しました!上記のコードで重要なのが、

[CustomPropertyDrawer(typeof(Test.EnemyData))]
public class EnemyDataDrawer : PropertyDrawer

この部分です!この部分で指定の構造体の描画を変更出来るようにしています。
基本的にはRect型で座標などを調整して、フィールドを描画しています。
現状は少ない情報量ですが、これが増えてくるとリストから描画がはみ出てしまうので、

private void OnEnable()
{
#region テスト用リスト

// Test.csにあるリストを取得
testListRL = new ReorderableList(
	serializedObject,
	serializedObject.FindProperty("enemyData")
);

testListRL.elementHeight = 110; <- ここでリストの描画範囲を増やす

testListRL.elementHeightで逐一描画範囲を増やさないといけないので注意してください。

もっと改造すれば画像を表示したりと色々なことが出来ますので、
みなさんも試してみてください!以上、ツバメでした。