読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】Unity4で書いたコードをUnity5向けに変換する「Script Updater」

Unity 4とUnity 5はAPIが幾つか異なる Script UpdaterによるUnity 5対応 アセットのインポート以外でもお目にかかるケース Script Updateに頼らない No Thanksした後でScriptUpdaterを起動したい Assembly UpdaterでDLLをUnity5向けに変換 Script Updaterの…

【Unity】Unityの新マルチプレイ機能、通称uNETのHLAPIがオープンソースへ

ひっそりとuNETのソースコードがオープンになりました。 Unity-Technologies / Networking / source / — Bitbucket オープンソース化したのはuNETのHLAPI(ハイレベルAPI)な部分です。 例えば「NetworkManagerHUD」とか、「NetworkTransform」など、そうい…

【Unity】Startのコルーチン完了後にUpdate処理を開始したい

Startのコルーチン完了後にUpdate処理を開始したい 遅延処理が完了するまでUpdateを呼ばない それ以外のコルーチン化 コールバックの中断 関連 Startのコルーチン完了後にUpdate処理を開始したい Unityのコールバック、例えばStartやOnTriggerEnter等は実は…

【Unity】シーン間でスコアを共有 まとめ

Unityの特性として「シーン遷移(LoadLevel)時にオブジェクトを破棄」します。このため、オブジェクトにデータを持たせている場合は破棄されてしまします。 しかしシーン内で解決する問題だけでなく、ゲームの進行では必ずといってよいほどシーン間のデータ…

【Unity】ゲーム起動直後に1度だけ処理を行う

ゲーム起動時に1度だけ処理を行います。 サンプル 今回は解像度を半分にする処理に使用します。これはStartやAwakeでやった場合、そのコンポーネントを持つオブジェクトが呼ばれるたびに解像度が半分になる…といった挙動になるためです。なので1回しか起動し…

【Unity】ScriptableSingletonでエディタウィンドウ間の情報共有

目次 目次 エディタは値を忘れる ScriptableSingletonを使う 感想 エディタは値を忘れる Unityエディタは実は物忘れが激しいです。 何が言いたいかと言えば、エディタウィンドウ等で使用されているstaticな変数を「ゲームの再生時やコンパイル時に忘れる」と…

【Unity】ScriptableObjectのコールバックが呼ばれるタイミングについて

ScriptableObjectのOnEnableが呼ばれるタイミングについてです。 PreloadAssetsに設定した場合 ゲーム起動直後に呼ばれます。シーンのロードすらされていないため、OnEnableでFindをかけても何も取得することは出来ません。 ちなみにエディタ起動時にも呼ば…

【Unity】ScriptableObjectを使用して、Scene間・Object間のデータ共有を行う

今回はScriptableObjectを利用してデータの共有を行う方法を紹介します。 この方法は「Find系が不要」かつ「事前にデータを定義する事が可能」で「Awakeが呼ばれる前にセットアップが完了」し「オブジェクト間・シーン間でデータが共有できる」といった扱い…

【Unity】ゲームの進行をコルーチンで制御する

Tanks!のプロジェクトを眺めていた所、ゲームの進行に面白い書き方をしていたのでメモします。 https://www.assetstore.unity3d.com/jp/#!/content/46209 Tanksのゲームの流れ Tanksのゲームの流れはシンプルです。 ゲームの開始時、敵の戦車と味方の戦車を…

【Unity】プロジェクトに不要なアセットをプロジェクトから退避するエディタ拡張を作ってみた

Unityのプロジェクトには様々なアセットが含まれます。そういったアセットの中から「ゲームの進行に必要な最低限のアセット」を残しプロジェクト外へ退避するアセットを以前に自作してみました。 これの続きです。 tsubakit1.hateblo.jp 得られる効果 機能 …

【Unity】Unityの内部APIを確認する方法、呼び出す方法

Unityを触っている上で、この機能はどのように実装されているのかや、公開されていないAPIを呼び出したい事があります。 その辺りの話です。 Unityの中のAPIを確認する アセンブリブラウザでUnityエディタの中のコードを確認します。 MonodevelopでSolution…

【Unity】エディタ拡張が「private」なメンバにアクセスする、多分一番楽な方法

Unityで「エディタからのみ外部アクセス可能なメンバ変数」を実現する方法の考察 - Qiitaqiita.com エディタ拡張が「private」なメンバにアクセスする、多分一番楽な方法についてです。この方法はEditor外にも処理を書かなければいけないので良くないですが…

【Unity】ゲームの作り方 Unityで覚える遊びのアルゴリズム

バンダイナムコスタジオ社内で行っている、Unity ワークショップの資料です。 だそうです。 内容は、非常に基本的な部分を綺麗な絵で説明しているので、割とわかりやすいと思います。 <a href="http://www006.upp.so-net.ne.jp/chewee/uni-mini-hon/works…

【Unity】コンソールログを検索する方法

Unityで開発を行っていると、膨大なコンソールログから1行を探して確認することが必要なケースが発生することがあります。そんな時は、Editotr.Logを確認します。 例えば自分の場合「ゲームが使用していないファイルをプロジェクト外に退避する」エディタ拡…

【Unity】UnityでAES暗号を使うアセット AesEncryptor

何やら暗号化の話でTLが盛り上がってたので、すこしAssetStoreを探した処、面白いアセットが見つかりました。 AES Encryptor 機能は凄い単純で、AvoEx.AesEncryptor.Encryptで暗号化、 AvoEx.AesEncryptor.Decryptで復号化です。 string orgText = "コナン君…

「同じNameSpaceで、同じクラス名の、異なるクラス」は実在した!

ここでクイズです 以下の問いに答えよ Test1.csとTest2.csがAssetsフォルダ直下とAssets/Pluginsフォルダ直下にそれぞれ1つずつあります。Assets/Pluginsフォルダ下のTest1コンポーネントをシーンから呼び出した場合、プログラムはどのように動作するでしょ…

Unityエディタの起動時のみスクリプトを実行する

先日から作ってる"Unity プロジェクトの中に、要求するアセット群が含まれない場合、該当ファイルのあるアセットを表示する奴ですが、やはりシンプルさを保つには「エディタ起動時にファイルが足りなければダイアログを表示すべき」との結論に至りました。な…

コンパイルエラー発生時でもエディタ拡張を使用する方法

今回は前回の応用で、プロジェクト内に必要なアセットが無い場合、AssetStoreからダウンロードしてもらう機能を作成してみました。 Unity プロジェクトの中に、要求するアセット群が含まれない場合、該当ファイルのあるアセットを表示する奴 pic.twitter.com…

【Unity】コンポーネントを設定したフィールドを非表示にする

最近ResetコールバックでFieldを登録するアプローチにハマっています。通常は実行時にFindやGetComponentでコンポーネントの取得を行うのですが、これを事前に取得します。事前に登録するのでFind等のアプローチが使えますし、GUI操作のような煩わしさも少な…

エディター操作で登録するのが面倒なボタンのクリックイベントを、スクリプトで登録する

Unityのボタン等のイベントをシーン内に登録/保持するには、UnityEditor.EventsのUnityEventToolsを使用します。 エディタ上でメソッドを登録するメリットは3つです。 実行時にイベントの登録処理を必要としない EventListenerの引数とマッチしないメソッド…

object.ReferenceEquals(someObject, null) の方が someObject == null より早い…が、盲目的に使うのは危険

先日#UnityTipsにて、中々に面白いTipsが紹介されました。 #UnityTips object.ReferenceEquals(someObject, null) is faster than someObject == null. — Mike Geig (@mikegeig) 2015, 5月 26 #UnityTipsとは 火曜日の大体夕方から夜にかけて、#UnityTipsの…

UnityでHierarchyの特定の親子構造のオブジェクトを見つける

実はパス指定でFindがかけられたそうです。マニュアルにも書いてありましたが、Find自体めったに使わないので知りませんでした。 例えば上の画像では、以下の様なコードを記述するとルート直下のSampleGame/Manager下のPlayerオブジェクトを取得します。 var…

処理を任意のタイミングで順番に実行する

先日のサウンドゲームジャムで中々に期待出来そうなゲームを作りました。 Unity Web Player | sgj2015gw このゲームでは基本的に音に合わせてゲームを進行させるのですが、昼から夜・もしくは夜から昼に変わる際にリズムに合わせて演出を行う的な物を作りま…

SendMessageに変わる新しいメッセージシステム、ExecuteEvents.Execute

Unity 4.6よりSendMessageに変わる新しいメッセージングが登場してしまいました。その名もExecuteEvents.Executeです。詳しくは下のマニュアルに書いてあります。 Unity - マニュアル: メッセージシステム この機能は、特定のインターフェースを持つコンポー…

UnityのCoroutine(コルーチン)でできる事のメモ

目次 目次 n秒後に何かする コルーチンの停止 コルーチンの一時停止 コルーチンの完了を待ち合わせる コルーチンの結果を受け取る 進行状況が表現可能な 待機 その他Tips 参考 n秒後に何かする コルーチンは、時間を絡めた処理を実装するのに便利です。例…

アプリ起動時に指定のメソッドを呼ぶ「RuntimeInitializeOnLoadMethod」に可能性を感じたが錯覚だった気が

追記版 tsubakit1.hateblo.jp Unityはゲームマネージャーを初めとした○○マネージャーを起動時にセットアップする事が出来ない為、多くの場合「○○マネージャーを作るマネージャー」をシーンに配置して、起動時にインスタンス化してもらう、起動用シーンを用意…

Unityで対象のポイントへ等速で動かす

目標位置へ等速で動かすコードです。目標時間で最終目的地に到着するような感じです。下のgifだと1秒で目標地点まで到着します。 // Unityで座標を等速直線的に動かすやつ。コメントアウト解除するとカーブエディタで他の移動パターンも作れる 解説 まず、…

UnityのAttribute(属性)についてまとめてメモる。

Unityの属性について紹介します。 目次 目次 属性(Attribute)とは 属性の表記ルール Unity標準の属性 Inspectorを拡張する属性 SerializeField TooltipAttribute SpaceAttribute HeaderAttribute MultilineAttribute TextAreaAttribute HideInInspector NonS…

UnityのuGUIでスクロールビューを作る

Unity4.6で追加したuGUIでスクロールバーを作る方法について紹介します。 大体こんな感じのスクロールバーを作ります。 作り方 まず、リストに表示するノードのプレハブを用意していきます。 適当な横長のImageを用意します。名前はNodeとします。 左の方に…

uGUIでノベルゲームのようなものを作る、その2 コマンドによる挙動の管理

uGUIでノベルゲームのようなものを作る…の続きです。 今日はコマンド周りをやります。 uGUIでノベルゲームのようなものを作る。その1 - テラシュールブログ uGUIでノベルゲームのようなものを作る。その1 - テラシュールブログ シナリオをテキストファイル…

Warningメッセージを消す

Unityで適当にコードを書いてると、沢山ワーニングがでてとても精神衛生上悪いです。これを消す方法を紹介します。 このボタンを押すと消えます。ぽちっとな ちがう、そうじゃない。 まあ、ココでも消せますが、これでは全てのWarningが消えてしまいます。な…

Unityエディタ上で作成したMeshをOBJファイルとして出力する

以前紹介したメッシュの結合ですが、OBJを吐き出せるようにしてみました。 ここからパッケージをダウンロード出来ます。 Unityのシーン上に配置したモデルを結合する - テラシュールブログ Unityのシーン上に配置したモデルを結合する - テラシュールブログ …

Unityのゲームにスマホ向けなバーチャルパッドを追加する

Unityで取り敢えずゲームを作る過程で「Input.GetButton」系を使用している場合でも、タッチパネルに対応する方法を紹介します。 今回もSample Assetsシリーズです。 新 Standard Assets候補、Sample Assets (beta) - テラシュールブログ 新 Standard Assets…

NPC・敵の巡廻ルートを変更する[Unity]

特定のルートを巡廻する際、ルートを変更したくなるケースが有ります。例えば「人が詰まっていて通行できない」ようなケース、「障害物が置いてあり通過出来ない」ケース、「ステージが変化し最短ルートが変更された」ケース等々です。 メッシュに移動コスト…

特定ルートを巡回したりする方法[Unity]

ゲームを作成している内に、村人や敵兵を特定のルート巡廻させたり、障害物を特定ルートで動かしたり、レーシングゲームでカートを周回させたり等々、そういったギミックを作りたくなります。 この「Unityで特定のルートを巡回する」方法は、パっと思いつく…

さよならBooさん・・・

Unity 5からBooがサポートされなくなるみたいです。 Documentation, Unity scripting languages and you – Unity Blog Documentation, Unity scripting languages and you – Unity Blog 理由はごく単純に使ってる人がほとんど居ないから。Unityデベロッパー…

Unityで無料でコードを書かずにゲームを開発したい人の Behaviour Machine Free

Unityで「ゲーム」を作ろうと思った場合プログラミングは避けられません。 そのプログラミングの過程で「C#」もしくは「UnityScript」を選択する事となりますが、最近おもしろい選択肢を見かけました。 Behaviour Machine Free Behaviour Machineは、ビジュ…

Resourcesから非同期でインスタンス化する

Unity 4.5.3よりResources.LoadAsyncが追加されました。これは今までResources.Load時に停止させていた時間を停止させず、非同期でロードする命令です。 しかし、実際にコレを扱ってみて失望するかもしれません。理由は簡単で、非同期で読んでいるハズなのに…

Unityの整形時のインデントをMonodevelopを使わず整形する

ソースコードを整形すると、ソースコードが読みやすくなります。少なくともコーディングに慣れていない内はソースコードを整形すべきと思います。*1 ソースコードを整形するのが面倒くさい場合は、ソースコードを自動的に整形するが使用できます。これならば…

UnityのベクトルとQuaternionによる回転について

Quaternionでベクトルを回す Quaternionの加算 Quaternionを求める サンプル その他 Quaternionは回転情報です。transform.rotationに格納されています。 このQuaternion(回転)ですが、Vector3(ベクトル)と合わせると、Vector3を回転させる事ができます…

UnityのSceneViewにラベルやボタンを表示する

Unityのシーンビューへ線へオブジェクトの影響範囲等を記載する場合、Debug.LineやGizmoで行います。 その派生で、シーンビューへ文字列を表示したい場合、若干面倒ですがOnDrawGizmosやOnDrawGizmosSelectedコールバック内でHandle.Labelを使用します。 Han…

UnityのCameraが使う3つの座標系

目次 目次 3つの座標系 スクリーン座標 ワールド座標 ビューポート座標 各座標系を使用するケースと変換 WorldToViewportPoint ScreenToWorldPoint ViewportToWorldPoint 関連 3つの座標系 Unityの使用するカメラでは、3つの座標系があります。すなわち「ス…

Unityで接触したブロック達を吹っ飛ばす

物理演算的には正しくなくとも、表現的に物体がぶつかった時にふっとばすのはよくある事だ。また爆弾等でふっ飛ばしたい場合もある。そんな時は「周囲のコライダーを全部持ってきて、その中でrigidbodyがあるオブジェクトに対してAddForceを実行」みたいな事…

Unityで、Editor シーン上にプレハブとしてオブジェクトを配置する

プレハブとしてオブジェクトを作成するには、以下のようにコードを記述します。#if UNITY_EDITOR var tile = UnityEditor.PrefabUtility.InstantiatePrefab(prefab.gameObject) as GameObject; #else var tile = Instantiate(prefab.gameObject) as GameObje…

シーン内のオブジェクトをInstantateするメリット

弾を生成する場合、以下の手順を行うのが一般的だ。弾のprefabを生成Resources、もしくは参照から1を取得2をGameObject.Instantiateする実はGameObject.Instantiateは、別にプレハブでなくとも実行できる。 GameObject.Instantiateの本質は「GameObjectをク…

rigidbodyの落下位置を予測するには…

剛体の落下位置を物理学で予測する。 powerの分だけ左にふっとばす感じのソースコードを用意。rigidbody2dでもrigidbodyでも良い。rigidbody.AddForce(Vector3.left * power, ForceMode.Impulse); もしくは rigidbody2D.AddForce(Vector2.right * -power, Fo…

AddComponentに気をつけろ!

UnityのGameObjectコンテナを使う面白い使い方として、AddComponentがある。この機能は、GameObjectに特定のコンポーネントを追加し、その参照を得る物だ。これを使うと、オブジェクトに動的に機能を追加する事が出来る。しかし、このAddComponentを利用する…

一時的にLoadLevelする際にGameObjectが破棄されないようにする

フラグの管理についてアレコレ考えていたら、ゲームオブジェクトを次のシーンへ受け渡す面白いアイディアが浮かんだ。 Unityでゲームを作っている場合、LoadLevelによるシーン遷移をよく利用する。LoadLevelはメモリをスッキリして参照関連や変数を上手い感…

Unityでゲームのフラグ管理

ちょっと聞かれたのでUnityでフラグ管理について。 これの続きです。 tsubakit1.hateblo.jp フラグ管理と聞けば面倒なように聞こえるが、要するに何処からでもアクセス出来るようなクラスに値を持たせておくだけでOKだ。後はifやswitchで必要になった時に確…

コンポーネントとプレハブの紐付けを自動化する

Unityはプレハブとして登録したゲームオブジェクトへ参照を持つことが出来る。STGを作るケース等では割とこの方法でオブジェクトへの参照を持ち、Instantateでインスタンス化するのが常套手段となる。実はこの参照、オブジェクトにアタッチする前に登録する…