PlayMaker - EcosystemとuGUIの利用方法

購入してから数年寝かし続けてきたPlayMakerをいい加減勉強しようと着手中で、本記事はその備忘録です。 私がPlayMakerを利用するに辺り、一番知りたかった、Ecosystem, uGUIとの連携を主に記載しています。

また、PlayMakerは以下から購入できますので、是非お使いください!

基本機能

状態遷移

f:id:project-unknown:20170516013300p:plain ここで右クリックで新規に状態を追加。

Event

f:id:project-unknown:20170516013331p:plain ここでイベントフラグを付与して、冒頭の状態遷移に利用出来る

f:id:project-unknown:20170516013344p:plain

このFNISHEDは該当状態遷移の処理が終わる時に次の状態に遷移出来る。

Ecosystem

デフォルトのPlayMakerだとuGUI等を殆どいじることが出来ません(uGUI以前に作成されたAssetと言うのもあるので)。 そのような時様にアドオンを導入するための便利なパッケージ管理システムがEcosystemとなります。

公式のダウンロードページから、「EcosystemBrowser Package」をダウンロードしてきて、Packageをimportします。 すると、

f:id:project-unknown:20170516013359p:plain

PlayMaker > Addons > Ecosystem > Ecosystem Browserが導入されます。 起動すると、

f:id:project-unknown:20170516013413p:plain

こんな感じで、packageを検索してinstall, deleteが出来るようになります。

uGUI

uGUI向けパッケージの導入

上述の通りPlaymakerのuGUIは貧弱です、なので、Ecosystemを用いてuGUI向けの追加パッケージを導入します。

f:id:project-unknown:20170516013435p:plain

uGUIを直接いじるばあいは、uGui Proxyで十分なのですが、他のGameObjectからuGUIを操作したい場合は、Fullを入れておいて間違いが無いでしょう(必要な機能だけ入れようとしたのですが、依存関係の問題かエラーになってしまったのでFullで導入しました。

別のGameObjectから、uGUIを操作する。

https://www.youtube.com/watch?v=BYwkd80T5Zk こちらで紹介されているText操作をuGUI向けで実施します。 (uGUI以外の設定はyoutubeを見ながら設定してください)

ではEnter Stateになった際にuGUIを操作します。

f:id:project-unknown:20170516013455p:plain Enter Stateを選択し、 f:id:project-unknown:20170516013504p:plain アクションブラウザを押して f:id:project-unknown:20170516013726p:plain uGui Text Set Textを選択します。 後は、これまでのUI操作と同じで、以下のように設定すれば、別なGameObjectからuGUIを操作出来るようになります。 f:id:project-unknown:20170516013744p:plain

最後に

今回は時間切れの為、ここまでで…。 また使っている内に、有用な事に気づいたら載せていこうと思います。 PlayMakerは使いこなせれば、ノンプログラミングである程度の事ができるので、非常に強力なアセットです。 私含め、是非使いこなしていきたいですね。

今回ご紹介したPlayMakerは、以下から購入できるので、まだお持ちでない方は是非ダウンロードしてください!

3D空間に2D(Sprite)を設置する

ゆう@あんのうんです。

概要

タイトル通り、3D空間に2D(Sprite)を設置するやり方です。 使っている絵は即席で作ったので大変お粗末な仕上がりになっているので承知置きくださいmm

作るもの

  • Planeを引いてその上にSpriteを設置します。

作成

まずは3DでUnityの新規Projectを立ち上げます。

Kobito.2yrLLF.png

今回は道っぽいものの上にSpriteを配置しようと思うのでPlaneを設置します。 (画像は手書きの凄い適当なやつ)

Kobito.Yqen4n.png

ちょっと周りの白いのが気になるので、Rendering ModeをCutoutにします。

Kobito.eNW1Do.png

次にPlaneにRigidBodyとBox Colliderのコンポネントを追加します Kobito.9XouaY.png

次にCreateEmptyから空のGameObjectを作って、SpriteRendererにSpriteを割り当てます。 (きゃらはオリジナルですmm

Kobito.rw0BMR.png

後はこのGameObjectにもRigidBodyとBox Collierを追加します。 Kobito.tJbLkj.png

これで、3D空間上にSpriteを設置することが出来るようになりました。

Unityで解像度に合わせて画面のサイズを自動調整する

はじめに

ゆう@あんのうんです。 久々にUnity絡みのお話です。

解像度に合わせて画面のサイズを自動調整する

今回は、様々な端末が出てきている中、それぞれの解像度に合わせたSpriteとかの表示サイズを自動調整するやり方です。 カメラに以下を仕込む事で実現できます。

void Awake() {

    // 開発している画面を元に縦横比取得 (縦画面) iPhone6, 6sサイズ
    float developAspect = 750.0f / 1334.0f;
    // 横画面で開発している場合は以下の用に切り替えます
    float developAspect = 1334.0f / 750.0f;
    
    // 実機のサイズを取得して、縦横比取得
    float deviceAspect = (float)Screen.width / (float)Screen.height;

    // 実機と開発画面との対比
    float scale = deviceAspect / developAspect;

    Camera mainCamera = Camera.main;

    // カメラに設定していたorthographicSizeを実機との対比でスケール
    float deviceSize = mainCamera.orthographicSize;
    // scaleの逆数
    float deviceScale = 1.0f / scale;
    // orthographicSizeを計算し直す
    mainCamera.orthographicSize = deviceSize * deviceScale;

}

Unityのスプラッシュ画像表示中に、処理を止める方法 (iOS)

ゆう@あんのうんです。

例えば、Unityの初回シーンで広告を生成して表示しようとした際に、スプラッシュ画像にまで広告が出てしまう事が度々あります。

スプラッシュ画像がちゃんと非表示になったのを確認してから表示するには、初回シーンのUpdate等に以下の判定を入れましょう

void Update() {
    if (Application.isShowingSplashScreen == false) {
        // 広告などの処理
    }
}

Application.isShowingSplashScreenは、スプラッシュが表示されている際にはtrueを返し、非表示の際にfalseを返します。

iOS9でunity4で利用していた古いArialで文字化け発生

はじめに

どうも、どうまずです。

iOSのバージョンがiOS9になり、いろいろ問題が発生していますね。
ゲームで文字化け発生っていう記事も何個かありましたが、特殊なことやっていない我々には、影響ないだろうと思ってたら、このエラーが直撃しました・・・
リリースしてなくてよかった・・・

原因・解決策

まず、発生状況なのですが、
unityのEditor上では文字化けは発生せず、iPhoneの実機テスト時に発生、日本語が全て「?」に変わっていました。
ネットで調べてみましたが、どうも困っている系の記事はありましたが、原因・対策の記載がない・・・。
自分で調査するしかないかな・・・

ゆうに相談したところ、障害の状況から
1.使ってるフォントがiOS9に対応していなく化けた。
2.UNITYで扱っているマルチバイトのエンコーディングが特殊だったため、iOS9の規格から外れた。

という可能性があるとのこと・・・

まず、フォントが対応しなくなった可能性から調査です。
私たちが利用していたフォントは「Arial」というよくあるフォントです。

試しに、別のフォントにしてiPhone実機確認をしたところ・・・
表示された!

え?まさか、「Arial」がダメになったのか?

影響範囲調査のため、「ゲームスタート」を「ゲームstart!」に変更。
その結果は

thumb_IMG_1670_1024_jpg.png

続いて、「GameStat!?」(Gameと!が全角)としてみました。
結果は次の通り

thumb_IMG_1671_1024_jpg.png

調査の結果、
「iOS9からArialのマルチバイト文字が利用出来なくなった。」
との結論に至りました。

そもそも、Arialは本来シングルバイト文字のフォントだったのですが、無理やりマルチバイトを表示できるようにしていたそうです。

対応方針としては、マルチバイト文字はArialではなく、別のフォントを利用する。

にして、Arialという一般的に利用されている文字のマルチバイト表示を切るとは、なかなか大胆な仕様変更ですね・・・ビビります!

[追記(重要)]

今までunity4で開発していたのですが、いろいろありunity5にバージョンあげてみようってことになりました。

バージョンアップをした結果、文字化けが治ってる!!

つまり、結論は変更です。

「iOS9ではunity4で利用していた古いArialが利用できなくなった。」

これが正解だったようです。

最初の結論だったら、もっと混乱が起きてもいいと思ったのですが、こういうことだったのですね。

unity4で開発している人は勇気を出してバージョンアップですね。

我がトラウマ、広告実装(AdMod)を行う

はじめに

どうも、久々に投稿させて頂きます。どうまずです。

今回は時間がかかって、大変な思いをした広告実装について書きました。

やりかた

Unityの場合、公式でサポートされているので、まずはプラグインをダウンロード。

ダウンロード先:https://github.com/googleads/googleads-mobile-plugins/releases/tag/v2.2.1

次にダウンロードしたプラグインをunityにimportする。
unityを立ち上げ、目的のプロジェクトを開く。
その後、Assets>Import Pakage>Custom Pakageと移動し、
importするパッケージを聞かれるので、ダウンロードしたファイルGoogleMobileAds.unitypackageを選択する。

すると、下記のようなダイアログが上がるので、とりあえず、全部importする。

20150604_01.png

importすると、下記のようにAssets内にそれらしいフォルダが作成されている。

20150604_02.png

Androidの場合はなにやら設定が必要なようですが、
今回はiOSのみで実施するので、とりあえず無視!

iOSの場合、
File>Build Settingを選択、対象OSを聞かれるので、もちろんiOSを選択。
unityでは、ここでbuildしてしまえばおしまいらしい。
次はXcodeでの作業になる。
んで、Xcodeを開くと早速、10件近いエラーが発生。(トラウマ)

ここで、unityのプラグインではなく、iOSのSDKを利用するようなので、ダウンロードする。
ダウンロード先:https://developers.google.com/mobile-ads-sdk/download?hl=ja

SDKをダウンロードしたら、手動でimportする。
まずはフレームワークを追加。
プロジェクトを右クリックし、Add File to XXXXを選択。
追加対象を聞かれるので、GoogleMobileAds.frameworkを選択する。

そうすると、あら不思議、エラーが綺麗になくなりました!
うそ、やった!やったよ〜〜!

よし、実行だ〜〜〜って、実行したら、エラーが23個も発生・・・
心が・・・心が折れそうだ・・・・

って、焦って作業の続きをしていなかっただけであった。
フレームワークがプロジェクトに入っていない可能性があるので、確認に、場合によっては追加する必要があった。

よし、では確認だ・・・って、どうやって確認するのかいまいちわからないので、調査。

下の画面みたいに辿っていけばフレームワークみれます。

20150604_04.png

確かめるフレームワークは下記の通り。
なかったら、追加だそうだ。

  • AdSupport ×
  • AudioToolbox ○
  • AVFoundation ○
  • CoreGraphics ○
  • CoreTelephony ×
  • EventKit ×
  • EventKitUI ×
  • MessageUI ×
  • StoreKit ×
  • SystemConfiguration ○

私の場合は4つしかなかったので、あとは追加
これで、再ビルド、エラーよ消えろ!

またまた、エラーが23個・・・心が・・・折れそうだ・・・。

まだ、ソースコードを一切記載していないためなのかもしれない。
と思い、サンプルソースをそのまま記載したが、エラーが全く減らない。

/Users/doumazu/patapata-unon/PatapataUnonXcode/Libraries/GADURequest.h:3:1: Use of '@import' when modules are disabled

エラーの内容を調査してみると、
どうやら、importがうまく動作していないようだ。

調査すると、

@import Foundation;

と「@import」と記載されている部分を一つずつ下記のように書き換え

#import <Foundation/Foundation.h>

と書き換え。
すると、エラーが消えて、buildが成功しました。

あと、
不確定な情報ですが、いろいろ調査すると、
下記の処理を実施するようにと記載されているサイトが何箇所かありました。

Build settingsのOther Linker Flags に-ObjCを追加する

だけれども、私の場合、やってもやらなくても結果は変わらずでした。
もし、なぜかエラーが出続ける場合は、試してみるのも価値があると思います。

UnityでParseを使ってみる

はじめに

ゆう@あんのうんです。 多忙すぎて、まったく記事が掛けなかった。。。

職場でサーバサイドの面倒を見ていて、散々な目にあった為、プライベートのアプリでは絶対にサーバ周りはいじらない!!って決めていて、サーバ周りの情報を集めていなかったのですが、、

標題の通り、ParseってBasS(mBaaS)に出会って、非常に感動し、勢いでがちゃがちゃいじったのでその備忘録です。

一番最後に宣伝をしてます、内容自体は、「Codeから取得する。」で完結しておりますので、不愉快な方がいらっしゃいましたら、最後は読み飛ばしてくださいmm

ここでやること

  • Parseにユーザ登録をする
  • お知らせの情報をParseに登録する
  • Unity上でParseの設定を行う
  • Unity上からParseで登録したお知らせ情報を取得する。

Parseへ登録する

とりあえず

https://www.parse.com/

上記サイトから登録を行います。

Parseにお知らせ情報を登録する。

OtherApplicationsというクラスを登録します。

03.png

③のAdd Class時に追加したいクラス(イメージは新規テーブル)を登録。 (画面は、既にクラスを登録したものです。)

④で新規Colum追加を行います。 ⑤のようなダイアログが出るので、追加したいColumを登録します。

ここでは、以下を登録しました。

  • applciationName
    • アプリケーション名
  • applicationDescription
    • アプリの説明
  • appStoreURL
    • AppStoreのURL

ParseのUnity SDKを取得する

次にUnityへの設定を行います。

https://www.parse.com/docs/downloads

上記から、Unity用のSDKを取得します。

または、Asset storeにもあるので、そちらか入手してもOKです。 (Unity4.6.3等、1つ前のバージョンの場合は、Asset Storeで入手した方が良いです。)

Unity上でBehavior登録

適当に空のオブジェクトを配置して、Add ComponentでParseを登録します。 01.png

ここに、Application IDと.Net Key(Dotnet Key)を登録します。 Application IDと、.Net Keyは、ParseのWebコンソール上から取得します。 (↓を参照)

02.png

Codeから取得する。

なんでも良いManagerクラスを登録追加して、以下のコードを埋め込みます。 単純にデータをParseから取得して、Logに出力するコードです。

public void Load(){
        ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("OtherApplications");
        query.FindAsync().ContinueWith(task =>
            {
                    IEnumerable<ParseObject> results = task.Result;

                    foreach(ParseObject parseObject in results) {
                        string applicationTitle = parseObject.Get<string>("applicationTitle");
                        string applicationDescription = parseObject.Get<string>("applicationDescription");
                        string applicationAppStoreURL = parseObject.Get<string>("appStoreURL");
                        Debug.Log(applicationTitle);
                        Debug.Log(applicationDescription);
                        Debug.Log(applicationAppStoreURL);
                    }
            });
    }

これで無事ログに出力する事が出来ました。

04.png

最後に

Parseを利用することで、バックエンドの構築などを行わなくても簡単にサーバを利用したシステムの構築を行うことが出来ます。

これは、今までバックエンドに掛けていた時間を最小限に抑えて、アプリの開発に集中できるので、非常に強力な武器となりそうです。


最後にスクショで名前が出ているAppはこちらで紹介していますので、お時間のあるときに是非是非!

uGUIで設置したUIが端末の解像度によってずれる問題

はじめに

ゆう@あんのうんです。

Unityで開発していてUI周りでお世話になることになる、uGUIですが、

スマフォアプリなどで端末の解像度にかなり左右される時だと、座標連れが頻繁に発生します。

今回は、その対処法の1つをご紹介します。

対処法

まずは、CanvasにUIを突っ込みます。 (以下はあくまで例です)

03.png

ここで、Canvasの設定を以下の様に設定します。

04.png

Ui Scale Modeを Scale With Screen Size にします。

次に Reference Resolutionを現在対象としている解像度に合わせましょう。

私の場合は、320 x 568でiPhone5, 5S用に設定しています。

次に、Screen Match Modeですが、以下の様に意味合いが分かれます。

項目 意味合い
Match Width Or Height 幅か高さを基準にして拡大、縮小する。これを選択した場合、下部にMatch項目が出現して、どちらに比重を合わせるかを指定できる
Expand 解像度が大きい場合、画面の領域を広げる。小さな解像度の場合はそのままの大きさ。
Shrink 実際の解像度におさまるように、縦横の比率を保ったまま縮小する。

Sampleでは縦に持つゲームにしようとしているので、「Match Width Or Height」に設定し、MatchをHeightに大きく比重を置くようにしています。

上記で解像度が変わってもある程度表示崩れが起きなくなります。 表示崩れが起きた場合は、Matchの値を調整してみると良いかもしれません。

Unity2DでuGUIで作ったボタンの画像を動的に変更する

はじめに

ゆう@あんのうんです。

すごい久々のブログ更新な気がする…

今日のお題はuGUIのお話。

uGUIで作ったボタンの画像を動的に変更する

以下の様にuGUIで設置したボタンをコード上で動的に変更します。 (ところどころモザイクが入っているのは、開発中のリソースが写り込んで居るためです、申し訳ありませんorz

01.png

02.png

uGUIで作ったボタンを変更するには、他のSpriteとは違って、Sprite Rendererを使って変更ではないのでご注意ください。

ボタンの画像を変更するには、Imageを利用します

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class FoodBom : MonoBehaviour {
    Image buttonImage_;

    void Start () {
        // コンポーネントからImageを取得
        buttonImage_ = GetComponent<Image>();
    }
    
    void Update () {
        buttonImage_.sprite = "適用したいSprite";

    }
}

上記で変更することが出来ました。

MonoDevelopの設定 (XCodeっぽくする + 日本語入力できるようにする)

はじめに

ゆう@あんのうんです。

職場で、不可解なバグに長時間悩まされて、リフレッシュがてら記事の更新です。 今日はMonoDevelopの設定を。

XCodeっぽくする

XCodeの開発が長いと、どうしてもMonoDevelopのFontに「うっ」っとなったり、残念になったりと…。(私だけですかね)

んで、当たり前の設定なんだけど、今日、気分転換にMonoDevelopのFontをいじったので、メモメモ

MonoDevelopのメニュー -> Preferences...をクリック

20150512211259.png

Fontsを選択

20150512211320.png

テキストエディタでEditをクリック

20150512211338.png

ファミリをMenloスタイルをRegular、サイズはお好きに(XCodeのデフォルトだと、11)

20150512211355.png

これでXCodeっぽく!

20150512211629.png

Macのデフォルトフォントを使う場合は、上記のファミリで、「Hiragino」を選択すれば綺麗にヽ(=´▽`=)ノ

日本語入力可能にする

これ多くの人がMonoDevelopを使わない理由っぽいですね…。 ちょろちょろと調べてみたら、多少変な感じはするものの、日本語入力できるようになる方法がありました。

次にUnity側の設定

Preferenceを起動して、External Tools -> MonoDevelop (built-in)を選択

20150512212131.png

入力できるようになりました!

20150512212306.png

ただ、若干動作が不安定かも…?

日本語が使えるエディタにしちゃう (2015/9/30 追記)

最近は、以下のXamarin Studioを利用するようになっています。 こちらは最近公式で日本語対応したと言うのもあり、動作が安定していてすごく使いやすい(と言うかMonoDevelop系統を開発しているところだから使いやすくて当たり前か…)

未だにUnityのエディタを探して放浪している方は是非!

Unity 設置したCanvasをスクリプト上で編集する(C#)

はじめに

ゆう@あんのうんです。

今回は、設置したCanvas(uGUI)をスクリプト上で編集するやり方です。

やりかた

まずは、Create -> UI -> TextでCanvasと子要素のTextを設置します。

01.png

設定はほとんどデフォルトで下図の様にしておきます。

02.png

表示上は以下

03.png

ここで、Textを操作する為のスクリプトをコンポーネントに追加します。 ここでは、TextSampleと言うクラスを追加しています。

04.png

クラスの中を以下のようにします。

using UnityEngine;
using UnityEngine.UI;           // これが無いと動かないよ!
using System.Collections;

public class TextSample : MonoBehaviour {

    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
    
    }

    void OnGUI() {
        var textComp = this.GetComponent<Text>(); // Textはコンポーネント扱いなので注意!
        textComp.text = "fuga";
    }
}

これで実行してみると、以下の様に「fuga」が表示されるようになりました!

05.png

Unity iPhone実機で確認した際に、動きがもっさりしている時の解決法。(FPS調整)

はじめに

ゆう@あんのうんです。 ゴールデンウィークをサボりまくったので、ひっさびさの投稿です。

Unityで開発をしていて、実機で走らせてみると、やたらと動きがもっさりして見える事があります。 処理の見直しももちろんですが、FPS(フレームレート)を調整してあげることで、滑らかになったりします。

やりかた

まず、Edit -> Project Settings -> Quality でインスペクタを開きます

次に、VSync CountをDon't Syncで設定します。

20150510013102.png

※ちなみに、DefaultのEvery VBlank(垂直同期)は、モニタのリフレッシュレートに同期されます。(今回は、この垂直同期を解除する設定を埋め込みました)

次に、コード上で目標フレームレートの設定を行います。

void Awake() { 
    Application.targetFrameRate = 60;
}

これで60Fpsを設定することが出来ました。 この状態で実機で確認すると、滑らかに動作するようになります。

Unity2d Scriptで生成したGameObjectを子として登録する。

はじめに

ゆう@あんのうんです。

とあるGameObjectがあり、動的にそのGameObjectに新しいGameObjectを子として登録する方法です。

やりかた

子としてGameObjectを登録すると、親の座標移動に従って相対的に座標変更できるので、パーティクルとかでGameObjectに一定時間エフェクトを表示する時など便利です。

例では、動的に生成したPrefabを子として登録します。

// プレハブを取得
GameObject prefab = (GameObject)Resources.Load("Prefabs/Effects/Prefab名");

Vector2 pos = new Vector2(gameObject.transform.position.x, gameObject.transform.position.y);
// プレハブからインスタンスを生成
GameObject obj = (GameObject)Instantiate(prefab, transform.position, Quaternion.identity);
// 作成したオブジェクトを子として登録
obj.transform.parent = transform;

上記Sampleの様に、生成したオブジェクトの、transform.parentに親にしたいオブジェクトのtransformを登録する事で、親子関係にすることが出来ます。

上記Sampleでやっている、Prefabの動的生成については、こちらの記事に詳細を載せています。

Unity2d PrefabをScript上からロードする。

はじめに

ゆう@あんのうんです。 喉の調子がずっと悪い…。

Prefabを作成し、それをScript上からロードするやり方です。

やりかた

Prefabを

01.png

上記みたいに、Assets > Resources > Prefabs > Effectsに設置した際、

以下の用にScript上からコール出来ます。

// プレハブを取得
GameObject prefab = (GameObject)Resources.Load("Prefabs/Effects/Prefab名");
// インスタンス生成
Instantiate (prefab, pos, Quaternion.identity);

これをResources以外のところに置くとうまく動かなかったのですが、他のところに置く場合はなにか別なやり方あるのですかね…。

とりあえず、ご紹介でした。

Unity シーン間で変数を共有する方法

はじめに

ゆう@あんのうんです。

シーン間で変数をやり取りしたいケースがママあります。 例えば、メインゲームシーンの結果をリザルトシーンで参照したり...

そのやり方を幾つかのメモ。 (SampleはC#です)

static変数でのやり取りする

クラスのメンバ変数をpublic staticで宣言しておくと、他のオブジェクトから参照ができるようになります。

また、これで宣言した変数がゲームを終了させるまで継続して保持されます。

下記SampleはMainGameシーンのhitpoint変数を、Resultシーンで取得しています。

/// -----------------------------------------
/// MainGame Scene
/// -----------------------------------------

public class MainGameController : MonoBehaviour {
    public static int hitpoint = 0;
    
    // getter
    public static int getHitPoint() {
        return hitpoint;
    }
    
    void Start () {
    }

    void Update () {
    }
}
/// -----------------------------------------
/// Result Scene
/// -----------------------------------------

public class ResultController : MonoBehaviour {
    void Start () {
        int resultHitpoint = MainGameController. getHitPoint()
    }

    void Update () {
    }
}

DontDestroyOnLoad()を使う

DontDestroyOnLoadを使うことで、Sceneを切り替えてもGameObjectが破棄されなくなります。

/// -----------------------------------------
/// MainGame Scene
/// -----------------------------------------

public class MainGameController :MonoBehaviour {
    public int hitpoint = 0;
    void Start() {
        DontDestroyOnLoad(this);
    }
}
/// -----------------------------------------
/// Result Scene
/// -----------------------------------------

public class ResultController : MonoBehaviour {
    void Start () {
        int resultHitPoint = MainGameController.hitpoint;
    }

    void Update () {
    }
}