2017年1月28日土曜日

UnityのButtonのOnClickに列挙型の引数を与える

調べた際のメモです。

概要

Unityでは、特定の契機で実行する関数をインスペクタで指定することができます。
ButtonコンポーネントにおけるOnClickや、EventTriggerでの各種イベント等がそうです。

で、インスペクタから関数を指定する時に「引数にEnumを指定できたら良いのになぁ」と思い、調べてみました。

結論

ググったらUnityのフォーラムが見つかりました。
「Ability to add enum argument to button functions」に投稿された方法 で実現できました。
原理の理解は皆無ですので悪しからず。

方法

  1. 上記リンクの投稿にあるスクリプトをDL
  2. 「UnityEventDrawer.cs」をAssets/Editorフォルダに、「EnumActionAttribute.cs」をAssets配下の任意の場所に保存
  3. EnumActionAttribute.csに「using System;」と「using UnityEngine;」を追記
  4. Enumを用意
    今回はGameManagerにWeaponTypeというEnumを作成しました。
  5. Enumを引数とするメソッドを下記のような感じで用意

    [EnumAction(typeof(GameManager.WeaponType))]
    public void hoge(int type)
    {
        GameManager.WeaponType enumType = (GameManager.WeaponType)type;
        //なんかの処理
    }

引数はintで定義します。メソッド内でEnumに変換して利用します。Enumは内部ではint型なので、単純なキャストで変換できるそうです。

すると下記のようにButtonのOnClickで列挙型を指定できました。



こういうのをエディタ拡張って言うんですよね。凄いです。Unityの素の機能ですら理解が追い付かないのに。

2017年1月16日月曜日

Unityで画面全体でタッチ入力を受け取る

Unityでハマったとこのメモです。

概要


  • 画面のどこをタッチしても入力を受け取るようにしたい
  • uGUIの要素で隠れていると入力を受け取れないようにしたい


結論

下記のようにすればよい
  1. Canvasに、画面サイズのTextを作成して、文字列を空にする。
  2. 作成したTextに、EventTriggerコンポーネントを追加する。
こうすると、画面全体がタッチ可能にしつつ、かつ、他のuGUIの要素を重ねてタッチできなくすることも可能になります。

経緯

画面全体でタッチを検出したい時、下記のようにしてました。

  1. シーン上のGameObjectにスクリプトを追加
  2. Update内でInput.touchesからタッチを取得
これで、「画面をタッチすると攻撃する」ということを実現していました。

けど、これだと、例えば「メニューを表示しているときはタッチしても攻撃しない」ということを実現するのが若干面倒です。
Inputを直接使うと、画面に何が映っていようと関係なくタッチを検出してしまうためです。

そこで、「uGUIの要素は重なって隠れているとタッチできない」という仕組みを利用したいと考えたわけです。

で、調べたところ下記のページに行き当たり、「結論」の方法を知りました。

補足

上記ページにもありますが、画面全体にタッチ検出できるImageを引き延ばして、アルファ値を0にして透明にする。という方法はダメです。「透明な色で画面全体を描画する」という処理が動きますので、パフォーマンスに悪いです。

上記ページでは他の方法も紹介されていますが、Unityのバージョン依存だったり、訳すの大変だったりしたので、ここで紹介はしません。興味があれば読んでみてください。

2017年1月9日月曜日

新アプリ「3D脱出ゲーム 古ぼけた小屋からの脱出」リリース

お久しぶりです。
約2年ぶりの投稿です。

Android用ゲームアプリをリリースしました。

3D脱出ゲーム 古ぼけた小屋からの脱出


リンクはこちら

脱出ゲームは定番ジャンルですが、3Dでキャラを動かす探索ゲームになっています。
10分もあればクリアできるかもしれません。



カメラ固定の探索ゲームはPS時代によくありましたね。


裏話的なもの

前の投稿から、色々ゲームを作っては諦め、作っては投げと、
だらだらやっていました。

長く時間がかかる趣味も大変だなー、と思っていたそんな時に、去年の後半から私のTwitterのタイムラインで「和尚本」や、「Unity一週間チャレンジ」といったワードがよく見られるようになりました。

「和尚本」とは「UnityではじめるC# 基礎編」のことです。監修の「いたのくまんぼう」という方の通称からそう呼ばれています。これを読んだら簡単にゲームが作れた!という声が続々上がっています。

「Unity一週間チャレンジ」はその名の通りUnityで一週間でゲームを作って、その経過を報告することです。元ネタは「game a week」というゲーム開発の訓練法のようですが、短期間でどんどん面白いアプリが公開される様子を見てると非常にモチベーションが上がってきます。

で、去年の終盤から「和尚本」を買ってUnityの勉強を始めてみたところ「Unityすげえ!」となり、一つゲームを作ってみようと思い立ったわけです。

作成の過程は記録していませんが、期間は2週間程度だと思います。まさかこんな短期間でできるとは思ってませんでした。一週間はいつかチャレンジしてみたいですね。

今回のゲームの作り方は主に「和尚本」をベースにしてます。3D部分はUnity標準アセットと、チュートリアルを参考に頑張りました。

久しぶりにゲームを完成まで持って行けたのは内心かなりうれしかったです。
今後ゲームを作っていくモチベーションにもなったと思います。

そんな裏話のあったこのゲーム、ぜひぜひ楽しんでください。