サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Pixel 9
unitygeek.hatenablog.com
unitygeek.hatenablog.com 上のブログに書いたように、UnityEventをpublic変数で定義すると、インスペクタにUnityEvent変数が表示され、インスペクタ上でコールバック関数を追加・削除できる。 コールバック関数が引数をとる場合は、インスペクタ上に引数を設定するフィールドも表示される。 UnityEventの問題(制約) しかし、この方法には次のような問題(制約)がある。 引数は1つしか取れない。引数が2つ以上あるメソッドは、インスペクタのリストに表示されず、指定することができない。 引数はインスペクタ上で静的に指定され、実行時にスクリプトで動的に指定することができない。 コールバック関数の引数を動的に指定する UnityEventのリファレンスを見ると、UnityEvent以外に、UnityEvent<T0>, UnityEvent<T0, T1>,
Unityの開発はUnity Editorで行うが、Editor上と実際の実行プラットフォーム(Windows, Mac, Linux、iOS, Androidなど)とで処理を変えたい場合がある。これには次の2つの方法がある。 1. "Application.platform"を使う方法 実行時にスクリプト内で現在の実行プラットフォームを見て、処理を変える方法。 docs.unity3d.com プラットフォームのクラス変数は、"RuntimePlatform"に定義されている。 docs.unity3d.com 2. プリプロセッサ"UNITY_EDITOR"を使う方法 コンパイル時に(つまり実行前に)ターゲットとなるプラットフォームを評価して、実行する処理を選択する方法。実行時に動的に評価するのではなく、プラットフォームに応じて実行ファイル自体を変えてしまうもの。 #if UNITY_
iOSデバイスにはさまざまな解像度、アスペクト比があり、それぞれに適切なUIとなるような工夫がいる。 参考: unitygeek.hatenablog.com 実現したいUI:トリミングとストレッチ たとえば、次のようなUIデザインを実現したいとする。 背景の画像は画面の縦サイズにあわせ、横方向はトリミングされる。 ボタンを3つ配置したメニューバーは、画面の横いっぱいに表示し、バー内にボタンを3等分して配置する。 テキストボックスは、横幅一定、高さはテキスト量によって変える。 具体的な完成イメージは次のようなものだ。2つの画面の解像度・アスペクト比はそれぞれ、iPhone5s, iPad Retinaを想定している。 背景の人物の写真は、iPhoneでは左右がトリミングされている。ボトムの黒色のメニューバーは、iPhone, iPadそれぞれに横方向いっぱいに表示され、ボタンは3等分されて
CanvasUI(uGUI)システムでは、ユーザの操作をEventで授受する。たとえばButton要素の場合、インスペクタのButtonスクリプト・ブロックの一番下に、OnClick()という項目がある。ここにOnClick()イベントを受け取る関数と渡す引数を設定する。 タブの"+"をクリックし、左下の枠にイベントを渡すGameObjectを設定し、右上の枠にイベントを送る関数をドロップダウンリストから設定する。左下は関数に渡す引数で、 なし float int string bool Object のいずれか。最後の"Object"はUnityのほとんどのクラス(たとえばGameObject, Component, Monobehaviourなど)のベースクラスなので、実質的にはほとんどのクラスを引数に指定できる。たとえばTransformや、GameObjectそのものも渡すことがで
参考:http://wiki.unity3d.com/index.php?title=Which_Kind_Of_Array_Or_Collection_Should_I_Use%3F Unityの広義の配列―コレクション―はいくつか種類がある。それぞれ宣言や代入、値の取出しの記述が異なる。また、自由度が高い反面、使わないほうがよいものもある。 1)ビルトイン配列(Built-in Array) もっとも基本的な配列で、もっとも高速。ただし宣言時に要素数を指定する必要がある。が、宣言後にリサイズは可能。(System.Array.Resize(ref myArray, size))で行う。) C#での宣言、代入、リサイズは次のように行う。ただし、多次元のビルトイン配列はリサイズできない。 TheType myArray = new TheType[lengthOfArray]; // de
わかりにくいタイトルだが、具体的な例で説明する。 下のように、メインであるクラス(下の例では、Physics)のPublic変数にカスタム・クラス(SubData) を指定しているとする。、 using UnityEngine; using System.Collections; public class SubData { public int data1; public int data2; private int data3; } public class Physics : MonoBehaviour { public SubData data; // 途中省略 } この場合、インスペクターから、SubDataクラスは見えない。つまり、data1, data2も見えない。 インスペクタからSubDataの中にある変数を見えるようにするには、Runtime Attributeの、[S
次のシーンに対してLightmappingを行う。 Windows-Lightmappingで、Lightmappingウィンドウを開く レイアウト内に埋め込むと便利 ヒエラルキービューでLightmapを焼き付けたいオブジェクトを選択し、Lightmappingビューで"Lightmap Static"にチェックを入れる。Lightmapを焼き付けたいオブジェクト全てに対し行う。 ヒエラルキービューでライトを選択し、LightmappingビューのBaked Shadowsで影の種類を選ぶ。影を付けたいライトに対し設定を行う。 "Bake Scene"をクリック。しばらく計算が行われる。 Lightmapが作成される。シーンからライトを削除してもライトがあるかのようなテクスチャーと影が得られる。 より自然なLightmapを作るには、shadow samplesの値を増やす、shadow
現在のScriptがアタッチされているGameObject以外のGameObjectにアクセするには次の方法がある。 1)Inspectorでアサインする public変数としてGameObjectを定義し、Inspector上で該当GameObjectをアサインする方法。 簡単だが、この方法だとScriptだけで完結しないため、デバッグや再利用がし辛い。 他のGameObjectにアタッチされているComponentに直接アクセスする場合は、public変数で該当Componentを定義し、InspectorでそのComponentを持つGameObjectをアサインすることに注意。(これはUnityEditor上でGameObjectを操作することしかできないための便法と思われる。) using UnityEngine; using System.Collections; public
Unityで、GameObjectの一部にマスクをかけるには、DepthMaskを使う。 参考:Unity - Manual: ShaderLab syntax: SubShader Tags 1. Maskとなるオブジェクトの設定 1-1. 新規シェーダを作成。Maskシェーダのスクリプト(下記)を記述する。 Maskオブジェクトの順番を、レギュラー・ジオメトリとマスクをかけるジオメトリの間に設定している。 Shader "Masked/Mask" { SubShader { // Render the mask after regular geometry, but before masked geometry and // transparent things. Tags {"Queue" = "Geometry+10" } // Don't draw in the RGBA cha
XmlDocumentを使ったXMLパース方法の続き。Unity Noobs: XML - Loading data from a xml file.のスクリプトが良い参考になるので、これを解読してみる。 サンプルのXMLは次。 <levels> <level> <name>Level 1 (xml)</name> <tutorial>Try comes close to all four objects. (xml)</tutorial> <object name="Cube"> Hi, I'm a cube! (xml) </object> <object name="Cylinder"> Hi, I'm a Cylinder! (xml) </object> <object name="Capsule"> Hi, I'm a Capsule! (xml) </object> <obj
参考:Bezier Curve Unityは標準ではベジェ曲線を扱うクラスはない。そこで、デベロッパーネットワークの投稿にあったベジェ曲線のクラスを使ってみた。 1.ベジェ曲線のクラス P0〜P3は制御点、関数GetPointAtTime( float t )で、曲線上の座標を取得できる。 using UnityEngine; using System.Collections; [System.Serializable] public class Bezier : System.Object { public Vector3 p0; public Vector3 p1; public Vector3 p2; public Vector3 p3; public float ti = 0f; private Vector3 b0 = Vector3.zero; private Vector3
javascriptでcoroutineを使う際は、 処理1 yield WaitForSeconds(2); 処理2 と、yiledをはさむだけでよい。 C#の場合は、StartCoroutine/IENumearatorの組になるようだ。 public void endRecording(){ if(isFile){ titleScreen.endRecording(); // StartCoroutine("resstartGame"); } } IEnumerator resstartGame(){ print ("before waiting"); yield return new WaitForSeconds(3); //Wait for 3 seconds print ("after waiting"); Application.LoadLevel(0); //If not
参考:Microsoft Kinect - Microsoft SDK - Unity3D UnityでKINECTを使う。方法はいくつかあるが、正攻法でMicrosoftのSDKを使ってみる。 注)以下はすべてWindows7以降の環境で行うこと。Macは非対応。 1.KINECT SDKをインストールする Develop for Kinect | Microsoft Kinect for Windowsの”Download SDK"をクリック。 下のページから”DOWNLOAD LATEST SDK"と”DOWNLOAD TOOLKIT"をクリックして各々のセットアップ実行ファイルをダウンロード。 ダウンロードしたセットアップファイルを実行して、KINECTドライバーや開発キットをインストールする。(詳細省略) 2.KINECTのUnity用ラッパーを準備する KINECTラッパーのU
Unityでは外部ファイルへのアクセスがやや面倒。ややこしいので具体例で示す。以下、Mac環境です。 まず現在のアプリケーションのパスは Application.dataPath で取得できる。ただし、実行環境でその値は異なる。(参考:Unity Script Reference – Application.dataPath Unity Editorからの実行 (プロジェクトフォルダ)/Assets appファイルからの実行、Mac (appバンドル)/Contents exeファイルからの実行、Win (実行ファイル名_data)フォルダ Web Playerからの実行 (unityデータファイルへのフルURL) 例えば、Projectビュー(=Assetsフォルダ)の下にtextureと言うフォルダを作り、その中にある"pict01.jpg"にアクセする場合... スクリプトは次のとお
MaterialPropertyDrawer Shaderlabのシェーダ・プロパティに、インスペクタでトグルや列挙型(enum)などを使うには、UnityEditorのMaterialPropertyDrawerクラスを使う。 Unityの組み込みMaterialPropertyDrawerには次がある。 Drawer 記述 機能 ToggleDrawer [Toggle], [Toggle(変数名)] トグル EnumDrawer [Enum(列挙型名)], [Enum(列挙型要素名/インデックス)] 列挙型 KeywordEnumDrawer [KeywordEnum(要素名,...)] キーワード列挙型 PowerSliderDrawer [PowerSlider(指数)] 指数スライダ IntRangeDrawer [Toggle] 整数スライダ Space [Space(スペー
UnityのMathf関数には、通常のMath関数以外に3Dインタラクティブ用に特化された関数がある。次は知っておくと効率化できそう。 関数名(引数) 機能 Clamp(,min,max) 最大・最小値でカット Pow(x,y) xのy乗 Ceil(x) 小数点切り上げ(floatのまま) CeilToInt(x) 小数点切り上げ&整数化 Floor(x) 小数点切捨て(floatのまま) FloorToInt(x) 小数点切捨て&整数化 RoundToInt(x) 小数点四捨五入&整数化 Sign(x) 符号(1または-1(float)) Lerp(from,to,t) 補間 LerpAngle(from,to,t) 角度補間(360度を考慮) InverseLerp(from,to,value) Lerpの逆関数 MoveTowards(current,target,maxDelta)
transform.RotateAround()関数を使う。 下の例では、targetオブジェクトのupベクター(Y軸)の周りを秒速45度でまわる。 第一引数のVector3.zeroはこのスクリプトがアタッチされるオブジェクトの回転基準点らしい。 var target:Transform; function Start () { } function Update () { transform.RotateAround(Vector3.zero, target.up, 45*Time.deltaTime); }
このページを最初にブックマークしてみませんか?
『Unityな日々(Unity Geek)』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く