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

Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

Unityエディタをバッチで起動し、プロジェクトにコマンドライン引数を渡す

Unityエディタをバッチファイルから起動するには、 "C:\Program Files\Unity543\Editor\Unity.exe" と書いたバッチファイルを作って、ダブルクリックすればよい。""でくくっているのは、フォルダ名Program Filesがスペースを含んでいるため。 ちなみに、Unit…

オブジェクトをきれいに配置する

等間隔スナップ オブジェクトを等間隔で並べたり、スケーリングしたりする方法。 設定 Edit => Snap Settings... で各軸のPositionおよびScaleのスナップ幅を設定する 移動 Control(MacはCommand)キーを押しながら、Sceneビューでオブジェクトをドラッグす…

オブジェクトのフェードイン・フェードアウト

Standard Shaderを適用したモデルのフェードイン・フェードアウトは、Colorのアルファ値を変更することによって、行う。 Color値を変えるメソッドは、 Material.SetColor(string propertyName, Color color) で、第1引数はどのColorを変えるかを指定するもの…

モデルデータの書き出しサイズを小さくする Mesh Compression

ビルドサイズを小さくする手段の一つに、モデルデータのメッシュサイズ圧縮がある。 これは、モデルデータのインスペクタ:Mesh Compressionで行う。 選択肢は、Off/Low/Medium/Highの4種類ある。 オリジナルのサイズが約38MBのFBXデータをAssetに読み込み…

プロジェクトのUnityバージョンを確認する

過去のプロジェクトが、どのUnityバージョンで作ったのかを確認する(裏)ワザ。 ProjectSettings/ProjectSetting.assetを、VisualStudioなどのエディターで開く。 バイナリファイルなので、基本、意味不明の文字列が表示されるが、最初のほうにUnityバージ…

Colorの補間

たとえば、点滅するインジケータなど、2つのカラー値を補間して表示したい場合に便利なのが、Color.Lerp()。 public static Color Lerp(Color a, Color b, float t); という形式で、t=0の時 Color a、t=1の時 Color b、t=0~1でaとbの間を線形補完する。 点…

スクリプトからShaderパラメータを変更する(例:_EmissionColorについて)

Shaderのプロパティを変更するには、materialのメソッド、SetColor(), SetFloat(), SetInt(), SetTexture()を使う。( Unity - マニュアル: スクリプトを使用したマテリアルパラメーターへのアクセスと変更) それぞれのメソッドは、たとえば、SetFloat(シェ…

スクリプトからシーンをロードする (Unity5.3~)

別なシーンのロードは従来、 Application.LoadLevel ("SceneNew"); としていたが、Unity5.3以降では使えなくなった(Obsolete). Unity5.3以降でシーンをロードする際は SceneManager.LoadScene ("SceneNew"); とする。あるいは、シーン番号を使って、 SceneMa…

XMLファイル読み込みのサンプルスクリプト

以前、XmlDocumentクラスを使ってXMLを読み込み、パースする方法について書いた。 XmlDocument()でXMLをパースする その1 - Unityな日々(Unity Geek) XmlDocument()でXMLをパースする その2 - Unityな日々(Unity Geek) が、XMLファイルの読み込み&パ…

Unity-C#で数値を扱うクラス

Unity-C#で数値を扱う場合、あまり考えることなく整数だとint、浮動小数点だとfloatをつい使ってしまうが、扱える範囲やサイズに応じていくつかの変数型がある。メモリサイズや速度をギリギリとつめたいときや、逆に大きな数値を扱う場合は、型の最適化を忘…

Event使用時のエラー"... can only be called from the main thread"

次のようなエラーがでた。 状況は次のとおり。 オリジナルの'subClass'のスクリプトで、別クラスであるmainClassのイベントReadに、('subClass'のスクリプト内の)Actionメソッドを登録していた。イベントが発行されるとsubClassのAction()メソッドが呼ばれ…

InputFieldにテキストを設定する際の注意点

Create-UI-InputFieldでInputFieldを作成すると、'InputField'オブジェクトの下に、PlaceholderとTextという名前の2つの'Text'オブジェクトが生成される。 Placeholder, Textの2つの'Text'オブジェクトは、作成時点で親のInputFieldオブジェクトにひもづけ…

iTweenの参考資料

スクリプトでアニメーションを行う定番ライブラリが、iTween。Flash(Action Script)ライク名表記で多彩なアニメーションを実装できる。 iTween for Unity by Bob Berkebile (pixelplacement)itween.pixelplacement.com ただ、iTweenの表記方法は結構忘れや…

Unity5のプロジェクトをUnity4.6で開く

Unity5で作成したプロジェクトを4.6で開きたい場合、次のように設定する。 UnityメニューのEdit/Project Settings/Editorを開き、 vertion controlのmodeを「Visible Meta Files」にする Asset Serializationのmodeを「Force Text」にする をおこなってプロ…

iOS用のレスポンシブなUIをつくる

iOSデバイスにはさまざまな解像度、アスペクト比があり、それぞれに適切なUIとなるような工夫がいる。 参考: Canvas(uGUI)の基本レイアウト - Unityな日々(Unity Geek)unitygeek.hatenablog.com 実現したいUI:トリミングとストレッチ たとえば、次のよう…

iOSアプリの作成手順

UnityからiOSアプリを書き出す手順についてのメモ。 iOSアプリ開発の前提として、App IDやプロビジョニングファイルといった情報を取得・設定しておく必要がある。これらについては次の記事を参考に。 iOS App開発:.p12ファイルとProvisioning Profileの作…

Unity5.1でOculus Riftを使う

Unity4.6でOculusRiftを使う場合は、ライブラリをインポートする必要があった。(ライブラリは4.6.3以降で利用可能)Oculus Riftの導入(DK2) - Unityな日々(Unity Geek) Unity5.1以降では、OculusなどのVRデバイスの標準で対応している。 UnityとOculusを…

Unity5でCharacterControllerを使う

方法1:CharacterControllerクラス(コンポーネント)を使う キャラクターとして動かすGameObjectを作る MainCameraを同GameObjectの子にする 同GameObjectに、Physics-CharacterControllerをアタッチする キャラクター移動のUIクラスを作る。参考:Unity-A…

覚えておくと便利な小技(Tips)

Unityの「ビギナーTips」の中に、結構便利そうなもの(で、知らなかったもの)があったのでメモ。 Snap Ctrl(Macはコマンド)キーを押しながら、移動、拡大・縮小、回転をおこなうと、一定の増分ごとに「スナップ」されて移動、拡大・縮小、回転を行える。 …

Asset Storeのダウンロードフォルダを変更する

AssetStoreからたくさんのアセットをダウンロードすると、いつの間にかCドライブがいっぱいになってしまう。僕の場合、もともとCドライブに空きが少ないので危険な状態になってしまっていた。 Asset Storeで購入したアセットの保存先を変更しようと思ったの…

Oculus Riftの導入(DK2)

Oculus Riftは初代DK1から使っているが、DK2も出てSDKもどんどんアップデートされている。ので、このあたりでUnity導入時の覚書を残しておくことにした。 OculusのDeveloperページ。"Oculus PC SDK"をクリック(この次元では、0.5.0.1 betaが最新だった)。 …

Unity Editor上かどうかで処理内容を変える

Unityの開発はUnity Editorで行うが、Editor上と実際の実行プラットフォーム(Windows, Mac, Linux、iOS, Androidなど)とで処理を変えたい場合がある。これには次の2つの方法がある。 1. "Application.platform"を使う方法 実行時にスクリプト内で現在の実…

C#からJavascriptのクラスを呼びだせない時

C#からJavascriptのクラスは、通常のC#クラスと同じように呼び出せる。たとえば、 [SerializeField]protected FPSInputControllerREI fpsInputController; //Javascript Class ところが、これでは「該当クラスがない」というエラーが出る。 Assets/Scripts/R…

角度指定と外部呼出しに関するベンチマーク

Unityでは、角度は、オイラー角とクォータニオンの2つの方法で扱える。また、回転を設定する際、角度の絶対値と、Rotate()で相対角変化を与える方法がある。いったいどれがもっとも効率的、すなわち高速なのだろうか? また、あるオブジェクトのクラスから…

uGUIのテキストにブラーがかかってしまう問題

uGUI(Canvas UIシステム)のTextUI要素にブラーがかかってしまう問題は、既知のバグのようだ。 現時点では、対応策はピクセル解像度の大きなテキストを作り、Scaleを小さくして縮小する、という手しかないようだ。 Text UI要素のインスペクタは次のような感…

uGUI: スクリプトからUIのパラメータを変更する

uGUIへユーザが操作した際にメソッドを呼び出すのとは逆に、スクリプトからUIの状態やパラメータを変更したい場合もある。代表的な例を下にあげる。 テキスト uGUIのテキストを変更するには、テキストGameObjectのTextコンポーネントを取得し、このText.text…

スクリプトのテンプレートを追加する

スクリプトを新規作成する際に、独自のテンプレートを使いたいことがあるとおもう。 その場合は、Unityのインスールフォルダ/Editor/Data/Resources/ScriptTemplates/の下にある、 80-Javascript-NewBehaviourScript.js.txt 81-C# Script-NewBehaviourScript…

Materialを比較する

あるオブジェクトにアサインされている特定のマテリアルを別のマテリアルに置き換えたかったので、次のようなコードを書いた。 [SerializeField]protected Renderer rend; //Target Renderer [SerializeField]protected Material matFrom; //Change from thi…

"9x9 Slice" Spriteを作成する

UI用のイメージを設定する場合、イメージを拡大しても周囲のラインは画像が荒れるので拡大したくない。これを実現するのが、「9x9スライス」というテクニック。要は、4つの角はスケーリングせず、中間の画像のみ拡大するという手法だ。 これをUnityで実現す…

CanvasUI(uGUI)要素にアニメーションを設定する

CanvasUI(uGUI)のインタラクティブ要素(Button, Toggle, Sliderなど)は、「操作状態」に応じて「外観」を変更できる。 操作状態 各UI要素の状態には Normal Highlighted Pressed Disabled の4通りがある。'Highlighted'はフォーカスがあたった状態で、マ…

Canvas UI(uGUI)のイベント処理

CanvasUI(uGUI)システムでは、ユーザの操作をEventで授受する。たとえばButton要素の場合、インスペクタのButtonスクリプト・ブロックの一番下に、OnClick()という項目がある。ここにOnClick()イベントを受け取る関数と渡す引数を設定する。 タブの"+"をクリ…

Canvas(uGUI)の基本レイアウト

Unity4.6から導入された新GUI、"uGUI"。従来のGUIより柔軟な設定ができるuGUIの導入についてまとめた。 CanvasUI要素をシーンに配置する ヒエラルキビュー、Create-UIで、CanvasのUI要素が表示される。CanvasUIは、まず土台となるCanvasをシーンに配置し、そ…

ジェネリックリストのジェネリックリスト(ジェネリックリストの入れ子)を作る

以前、「Unityで使える広義の配列」で書いたように、最近のC#では、ArrayListよりGeneric Listが推奨されている。 要素の型を指定できるので、よりロバストなコードがかけるGeneric Listだが、Generic Listの要素にGeneric Listを指定する、すなわち、Generi…

インスペクタでプルダウンリストを使う

インスペクタにプルダウンリストを表示するには、enumを使う。 たとえば、iTweenプラグインのイージングタイプをプルダウンリストで指定するには、 public enum EaseType { easeInQuad, easeOutQuad, easeInOutQuad, easeInCubic, easeOutCubic, easeInOutCu…

レンダリングの品質設定

レンダリングの品質設定は Edit-Project Settings-Quality でおこなう。 各パラメータを個別に設定もできるが、Levelsに"Fastest"~"Fantastic"までのプリセットがあり、それを選択することもできる。また、カスタム品質レベルを登録することも可能。 個人的…

覚えておくと作業がはかどるショートカット

シーンビューの操作と重複するが、シーン編集時に作業がはかどるUnity標準のショートカットキーをまとめた。 選択モード ショートカット 操作 q ハンドモード w オブジェクトの移動モード e オブジェクトの回転モード r オブジェクトの拡大・縮小モード t 矩…

C#のプロパティを理解する

プロパティの使用 (C# プログラミング ガイド) C#にかぎらずオブジェクト指向言語のクラス内の変数を外部から読み出したり、変数に値を設定する場合は、get/setメソッドを使うのが基本。しかし、変数ごとにいちいちget/setメソッドを設定するのは煩雑になっ…

ShaderLabの基礎:Culling & Depth Testingを理解する

参考:ShaderLab syntax: Culling & Depth Testing 英語の'cull'は「選びとる・間引く」という意味だが、CGの世界では「除外する」ととらえるとわかりすい。たとえば、「バックフェース・カリング」はポリゴンの裏面を表示しない処理になる。また、オブジェ…

ShaderLabの基礎:Texture Combinersを理解する

参考:ShaderLab syntax: Texture Combiners 基本的なVertex Lightingが計算された後、テクスチャが適用される。これはSetTexture()コマンドによっておこなわれる。 基本形は、SetTexture テクスチャ名 テクスチャブロックとなる。 ※フラグメント・プログラ…

ShaderLabの基礎:SubshaderとColor, Material, Lightingを理解する

1つのShaderには複数のSubshaderを記述できる。Unityは上からSubshaderを見ていき、現在のマシン(GraphicCard)に適用できるシェーダがあれば、それを適用する。 1つのSubshaderの中には、1つ以上のレンダリングパス(Pass)を指定できる。また、オプシ…

ShaderLab:Propertiesの種類

Properties{}ブロックの中に記述するPropertyは次の種類がある。 Float Range (Range):スライダで範囲指定 Color(Color):RGBAの4次元配列。各値は0~1 Texuture2D(2D):テクスチャ Rectangle(Rect): Cubemap(Cube):Cubemap Float(Float):不動小数点数 Ve…

Unity Shaderの基本構造

シェーダーとはレンダリングを行うプログラム。Unityには80以上のビルトイン・シェーダーが組み込まれている。 自分でシェーダーを書く場合の基礎知識をまとめる。Unity Manual/Shaders Overview Shader全体はShderLabでラップされる。基本構造は次のとおり…

Inputの種類

Unityにはさまざまな入力APIが準備されている。 Unity - Scripting API: Input Static関数としては次がある。Down/Up=Yesは、たとえばGetKeyに対して、GetKeyDown/GetKeyUpというメソッドもあるということ。 入力機器 メソッド 引数 戻り値 Down/Up キー Get…

SourceTreeでGitのコミットができない時の対応

UnityでGitを使う方法は【連載Git入門 第6回】SourceTreeでGitを始めよう!UnityのプロジェクトをGitで管理しよう | naichilab - Android iOSアプリ開発メモが参考になる。しかし、コミットしようとすると、 git: fatal unable to auto-detect email address…

Marmoset Skyshopを使う

Mamoset/SkyshopはUnity上でHDRIを利用できるライブラリ。クオリティの高い表現は定評がある。Tutorial: Introduction to Skyshop | Marmosetを参考に、Marmoset/Skyshopを触ってみる。まず当然のことだがSkyshopを購入し、unitypackageを読み込む必要がある…

軸周りの回転の方向

回転は一見単純な操作だが、すぐ忘れるので備忘録代わりに書いておく。 プリミティブをの円柱(Cylinder)を新規作成した場合、 transform.right :グローバルX方向&ローカルX方向=半径方向1 transform.up :グローバルY方向&ローカルY方向=円柱の軸方向 …

Unityで使える広義の配列

参考:Choosing the right collection type - Unify Community WikiUnityの広義の配列―コレクション―はいくつか種類がある。それぞれ宣言や代入、値の取出しの記述が異なる。また、自由度が高い反面、使わないほうがよいものもある。 1)ビルトイン配列(Buil…

実行の順番:OnEnable, Awake, OnLevelWasLoaded, Start

Unityのスクリプト内で初期化を行う関数はいくつかある。ひとつのスクリプトの中で実行される順番は次の通りらしい。(出典はこれ) Awake OnEnable OnLevelWasLoaded Start しかし、スクリプトを無効にした場合(Script.enabled=false)は、次の通り Awake …

インスペクタで、カスタムクラスの中にある変数にアクセスする

わかりにくいタイトルだが、具体的な例で説明する。下のように、メインであるクラス(下の例では、Physics)のPublic変数にカスタム・クラス(SubData) を指定しているとする。、 using UnityEngine; using System.Collections; public class SubData { publi…

コンポーネントが存在するかどうかを見る

GameObjectに対し、あるコンポーネントを持っているかを調べ、なければ足す(あるいは、処理を変える)場合の手順例えば、あるGameObjectに対し、rigidbodyコンポーネントがなければ新たに加え、rigidbodyコンポーネントを返す例。 if(rigidbody == null){ r…