投稿者「moku」のアーカイブ

moku について

iPhone, iPad & Android アプリを開発している mokuApps です。

パネルズ・オブ・ザ・デッド

パネルズ・オブ・ザ・デッドの世界へようこそ!
迫りくるゾンビの恐怖をお楽しみください!

本作はパネルタップ方式のパズルゲームです。
ライフと水分に注意しながらゾンビを倒し、できるだけ長く生き延びるのが目的です。

・武器の選択による戦略性
通常はナイフによりライフを消費してゾンビを倒します。
弾薬を獲得するとハンドガンによって、ライフを消費せずにゾンビを倒すことができます。
またマシンガンやグレネードでゾンビを一網打尽にすることもできます。

・ゲーム内の時間経過による視界の変化
パネルをタップしたり武器を使用するたびにゲーム内の時間が経過します。
夜になると視界が悪くなり、遠くのパネルが見えなくなります。
昼の内に物資を確保しておくなど、ゾンビドラマさながらの戦略が必要になります。

・獲得したポイントによりアップグレード
ゲームオーバーになると、生き延びた時間や倒したゾンビの数に応じてポイントが獲得できます。
そのポイントを使用してライフや水分の最大値を増やしたりスキルを獲得して、次のゲームを有利に進めることができるようになります。

・スキル
ライフ・水分・武器の強化やその他の4カテゴリ計41種類のスキルが用意されています。
スキルをセットできるスロットの数は限られていますので、自分だけの最強の組み合わせを探してみましょう。

・達成項目
32種類・合計300段階以上の達成項目があり、達成することでボーナスポイントを獲得できます。

※ アップグレードしていくと1ゲームにかかる時間が長くなってしまいますが、ゲーム中はいつでも中断して、次回に中断データから再開していただくことができます。

App Store Android app on Google Play

[Unity]:MonoBehaviour.OnApplicationPause()の挙動

[検証バージョン]
Unity 5.1.2p2
iOSシミュレータ 8.4
Android Genymotion 4.2.2 API 17

アプリがバックグラウンドに入った時・および復帰した時の処理を記述するMonoBehaviour.OnApplicationPause()

この中に記述する処理が重く時間がかかり途中でアプリが強制終了された場合、どのような挙動になるのか検証してみた。

・検証方法
OnApplicationPauseでバックグラウンド退避時の処理中に数秒待機してデバッグプリントを行う。

using UnityEngine;

public class GameController : MonoBehaviour {
	void OnApplicationPause(bool isPause) {
		if (isPause) {
			Debug.Log("OnApplicationPause()");
			System.Threading.Thread.Sleep(3000);
			Debug.Log("3 seconds lator..");
		}
	}
}

・iOSの場合
アプリ起動中にホームボタン2度押し→アプリを終了

-> applicationWillResignActive()
OnApplicationPause()
3 seconds lator..
-> applicationDidEnterBackground()
-> applicationWillTerminate()

ちゃんと3秒後にデバッグプリントされた後に、バックグラウンド→終了となっている。

ただし、OnApplicationPauseをコルーチンにした場合はバックグラウンドに入った時点で処理が一時停止してしまうので注意が必要。

・Androidの場合
ハードウェアボタンでアプリの一覧を表示→アプリを終了

OnApplicationPause()のデバッグプリントのみで、処理は途中で中断されてしまった?

Androidの場合は、OnApplicationPause()での処理には注意が必要みたい。

[Unity, NGUI]:スクロールビューにスクロールバーを追加する

[検証バージョン]
Unity 5.1.2p2
NGUI 3.9.1

スクロールビューの基本についてはこちらをどうぞ。

1.スクロールバーの背景となる部分とつまみの部分、計2つのスプライトを作成。
スクロールバーのスプライトを追加

ヒエラルキー上での配置はスクロールビューの配下以外であればどこでも大丈夫。

垂直方向のスクロールバーの場合は2つのスプライトの高さを合わせておく必要がある。
見た目的につまみ部分が前面に表示されるようにDepthの設定もお忘れなく。

2.スプライトにコライダーを設定
スクロールバーの背景部分をクリックして移動する機能が必要なければ、背景用のスプライトにはコライダーを設定しなくても大丈夫。
コライダーの設定は目的のスプライトを選択した状態で、メニューバーから「NGUI」-「Attach」-「Collider」とするのが簡単。

3.適当なオブジェクトにUIScrollBarコンポーネントを追加
UIScrollBar

UIScrollBarコンポーネント用にNGUI Widgetを作ってその配下に先ほど作成したスプライトを配置しておくのが綺麗だと思う。
目的のオブジェクトを選択した状態でメニューバーから「NGUI」-「Attach」-「Scroll Bar Script」。

UIWidgetではなく適当なオブジェクトでも大丈夫だが、UIScrollView自体にUIScrollBarコンポーネントを追加するとスクロールバーの挙動がおかしくなる。

4.UIScrollBarの設定
UIScrollBarの設定

Foreground, Backgroundにそれぞれつまみ用・背景用のスプライトを設定。
Directionも適切に。

5.スクロールビューにスクロールバーを設定
UIScrollViewにスクロールバーを設定

スクロールビューのインスペクタにScroll Barsの項目があるので、Horizontal/Vertical目的の方にスクロールバーを設定。

ここで一度実行すると、UIScrollBarのValueなどの値が反映されるので、そこでスクロールバーの初期位置などを設定できる。
UIScrollBarの設定

Sizeが、スクロールビュー配下の全体サイズに対する表示範囲。スクロールビューに対して2倍のサイズのものを配置していれば0.5となる。
Valueがつまみの初期位置、0〜1。

[Unity, NGUI]:スクロールビューの基本

[検証バージョン]
Unity 5.1.2p2
NGUI 3.9.1

・基本的な考え方
ヒエラルキー上でスクロールビューの配下に配置されているUIをスクロールビューの範囲に限定して表示する。

スプライトがスクロールビュー配下にない場合

スプライトがスクロールビュー配下にない場合

スプライトがスクロールビュー配下にある場合

スプライトがスクロールビュー配下にある場合

またその名の通り、スクロールビュー配下に配置されたUIは、実行時にドラッグなどにより見える範囲を動かすことができる。

よくグリッドビューと組み合わせて紹介されることが多いが、グリッドビューはあくまで多数の項目を整列するだけのもので、スクロールビュー自体とは特に関係ない。

・作り方
UI Rootが存在する状態で、メニューバーから「NGUI」-「Create」-「Scroll View」を選択する。
作成されたScroll Viewの配下にUIを配置する。

ドラッグでスクロールさせたい場合は、配下のUIにコライダーとUIDragScrollViewを追加する。
コライダーの追加は目的のUIを選択した状態でメニューバーから「NGUI」-「Attach」-「Collider」とするのが簡単。
UIDragScrollViewの追加は目的のUIのインスペクタで「Add Component」-「NGUI」-「Interaction」-「Drag Scroll View」を選択。

スクロールビューのインスペクタでドラッグで動かせる方向などを指定できる。
スクロールビューのインスペクタ

Puzzle Mahjong

New sense Mahjong puzzle game!

PuzzleMahjong1 PuzzleMahjong2

Select 3 tiles from table with same suits & contiguous numbers(chow), or with exactly the same kind(pung).
After pung, select one more same tile, can make 4 tiles set(kong).

These (chow, pung and kong) are all called ‘set’.

Make ‘Yaku’ with 4 sets, and get score!

App Store Android app on Google Play

パズル麻雀

麻雀パイを使った新感覚パズルゲーム!

パズル麻雀1 パズル麻雀2

場から、同じ種類で数字の連続した3つの牌(順子)もしくは同一の牌を3つ(刻子)を選択して揃えます。
刻子の後にもう一個、同じ牌を選択すると、4個の組み(槓子)とすることが出来ます。

これらの牌の組み合わせ(順子・刻子・槓子)を合わせて面子と呼びます。

4つの面子で「役」を作ると得点となります。

App Store Android app on Google Play

[Unity, PlayMaker]:DontDestroyOnLoadの不具合

PlayMaker 1.7.8.2

アクションカテゴリ「Level」のアクション「DontDestroyOnLoad」で指定したGameObjectがシーンロード時に消えてしまいます。

DontDestroyOnLoadアクションのソースを見てみると…

// (c) Copyright HutongGames, LLC 2010-2013. All rights reserved.

using System.Collections;
using UnityEngine;

namespace HutongGames.PlayMaker.Actions
{
	[ActionCategory(ActionCategory.Level)]
	[Tooltip("Makes the Game Object not be destroyed automatically when loading a new scene.")]
	public class DontDestroyOnLoad : FsmStateAction
	{
		[RequiredField]
        [Tooltip("GameObject to mark as DontDestroyOnLoad.")]
		public FsmOwnerDefault gameObject;

		public override void Reset()
		{
			gameObject = null;
		}

		public override void OnEnter()
		{
			// Have to get the root, since the game object will be destroyed if any of its parents are destroyed.
			
			Object.DontDestroyOnLoad(Owner.transform.root.gameObject);

			Finish();
		}
	}
}

せっかく引数で指定したgameObjectが指定されていません。
代わりにこのアクションを実行しているFSMを持つGameObjectがDontDestroyOnLoadになっているようです。

25行目を以下のように変更します。

			if (gameObject != null) Object.DontDestroyOnLoad(gameObject.GameObject.Value);

[Unity]:Unity5対応でハマった点

Unity4.5.5で作成した「あ〜ちゃ〜の大冒険」をUnity5対応する時にハマった点。

Unityバージョン4.5.5f1 -> 5.0.0p2

・シーン全体が暗くなった
アンビエントライトのせい。
メニュー「Window」-「Lighting」を開き調整する。

Unity5-lighting

・NavMeshAgentの挙動がおかしい
具体的には、あ〜ちゃ〜が一度立ち止まると、その後、移動しなくなる。
従来はNavMeshAgent.Stop()後にSetDestination()で座標を設定すると動いていたのだが、Resume()を呼び出す必要がある。

[Unity, PlayMaker]:Androidビルドで勝手にパーミッションが追加される

検証バージョン:Unity 4.5.5f1, PlayMaker 1.7.7f6

PlayMakerをインポートしたプロジェクトをAndroid向けにビルドすると、以下の権限(パーミッション)が勝手に追加されます。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

Unity自体が、特定のAPIを使用した場合にビルド時に自動的に権限を追加する仕様になっています。
一旦Androidプロジェクトを吐き出してからビルドする場合は変更できますが、直接apkを書き出す場合は厄介です。

もし該当する機能を使っていないのならば、PlayMakerのアクションを記述してあるスクリプトファイルを最初に削除してしまえば済むことです。

・android.permission.INTERNET
/PlayMaker/Actions/Network フォルダごと削除

・android.permission.VIBRATE
/PlayMaker/Actions/DeviceVibrate.cs

・android.permission.ACCESS_FINE_LOCATION
/PlayMaker/Actions/GetLocationInfo.cs
/PlayMaker/Actions/StartLocationServiceUpdates.cs
/PlayMaker/Actions/StopLocationServiceUpdates.cs

・android.permission.WAKE_LOCK
/PlayMaker/Actions/DevicePlayFullScreenMovie.cs

[参考]:apkに付与されている権限を調べる方法
aaptというADT付属のツールで調べることが出来ます。
詳しくはこちらを参考にさせて頂きました。
Yukiの枝折 – 「apkからマニフェストの内容を読み取る方法」

ゆるあぷ!様に「あ〜ちゃ〜の大冒険」をレビューして頂きました!

Androidゲームアプリのレビューサイト「ゆるあぷ!」(http://android.yuruapp.com)様に、「あ〜ちゃ〜の大冒険」を取り上げて頂きました!

ゆるふわ天使「あ〜ちゃ〜の大冒険」をあそんでみた

プレイ感などをかなり詳しく、ゆるふわな素敵な感じでご紹介いただきまして、とても嬉しいです!
カメラの移動に関しては他のユーザ様からも要望がありまして、どのような仕様にするか検討中であります。
今後のアップデートで対応できればと考えております。

今後ともどうぞよろしくお願い致します!