20200414のUnityに関する記事は7件です。

VRChatワールド作成メモ【VRC_Trigger編】

VRChat個人的メモ

つい先日VRChatデビューを果たし、もっとこういうことができるようになればいいのに
→自分でワールド作っちゃえばいいんじゃね?
という思想からワールド作成してみようとなったので
VRChatのお作法を調べてわかったことをメモがてら書いていきます。
試せてない部分もあって予測で書いている部分もあるので、皆さん自身で試してみてください。
実験してわかったものは追記予定です。

本記事の対象者

・VRChatでワールド内にギミックを仕込みたい方
・ある程度Unityの操作に慣れている方

環境

  • Unity2018.4.20f1
  • VRCSDK2(v2020.1.1)

本記事の概要

VRChatのワールドを作る上で様々なギミックを動かすために
一番よく使うであろうVRC_Triggerについて書きます。
VRC_Triggerを使えば、「ボタンを押したら花火が上がる」みたいなことが可能になります。

参考

公式ドキュメント↓
Triggers

日本語で書いてくれている記事↓
VRchat 日本wiki
VRC_Trigger - VRChat 技術メモ帳 - VRChat tech notes

VRC_Triggerとは

VRChatのワールド内で、様々な動作の起点となるコンポーネントです。
「使うボタンを押したとき」や「アバター(プレイヤーのキャラクター)がオブジェクトに触れたとき」などのタイミングで特定の処理を実行することができます。

上記の「使うボタンを押したとき」などはVRC_Triggerではトリガーという括りになっています。
まずはそのトリガーの種類を羅列します。

トリガー

トリガーとは

特定の条件で発火する起点となるものです。

VRC_Trigger_Actions.PNG

記述規則

  • トリガー名
    • パラメータ名(型):説明

共通しているパラメータ

※基本は以下パラメータが設定できますが、一部設定できないトリガーもあります。

  • Delay in Seconds(float):トリガーが発火してからアクションを実行するまでの時間(秒)。
  • Actions(List):トリガーが発火たときに実行するアクションリスト。
    • Receivers:Actionsのいずれかを選んだときに表示される。選んだトリガーが発火したときにどのコンポーネントにどんな値を設定するかなどを設定する。
      例:AnimationBool:Animatorの指定した変数を指定した値に変更する。

トリガー一覧

  • Custom(Unnamed)
    • Name(string):トリガー名。他のイベントから発火させるときに識別するのに使用する。

参考記事
Custom Trigger - Programming in VRChat
上記参考記事を読んでみるとCustomTriggerはActiveCustomTriggerというアクションで発火させるらしい。
他のトリガーを介して呼び出す形になるようです。これは応用で使いそうです。

  • Relay
    • Targets(VRC_Trigger):トリガーを発火させる他のVRC_Trigger

Relayが存在するVRC_Triggerの別のトリガーのいずれか(TriggerAとする)が発火したとき、
Relayも発火します。
発火したときに指定した別のVRC_TriggerのTriggerAを発火させることができる。

  • OnEnable
    オブジェクトが有効(SetActive(true)やワールド生成時?)になったときに発火する。

  • OnDestroy
    オブジェクトが破棄(Destroy)されたときに発火。

  • OnSpawn
    オブジェクトが生成されたときに発火。

  • OnNetworkReady
    プレイヤーがルームに完全に入った(おそらくアバターが表示されてプレイヤーの入力を受けつけられる状態になった)ときに発火。
    入室時の演出とかができそう?入室したユーザーにだけ反応しそう

  • OnPlayerJoined
    プレイヤーが入室したときに発火。OnNetworkReadyと違い、すでに入室しているプレイヤーにもイベントが発火しそう

  • OnPlayerLeft
    プレイヤーが退室したときに発火。

  • OnPickupUseDown

    • Interaction Text(string):使える状態のときに表示する文字列
    • Proximity(float):有効な距離(PickUpしているので意味があるか不明)

VRC_PickupでPickupしている状態でUseボタンを押したときに発火。
ペンを持ち、使うボタンを押したときに書くなどで使用。
Downという名前がややこしいが、ボタンが押された(押し下がった)という解釈をするとよい。

  • OnPickupUseUp
    • Interaction Text(string):使える状態のときに表示する文字列
    • Proximity(float):有効な距離(PickUpしているので意味があるか不明)

VRC_PickupでPickupしている状態でUseボタンを離したときに発火。
ペンを持ち、使うボタンを押したときに書くなどで使用。
Upという名前がややこしいが、ボタンを離したという解釈をするとよい。

  • OnTimer
    • Repeat(bool):繰り返しの有無。trueでタイマーをリセットし、何度もアクションを実行する。
    • ResetOnEnable(bool):このコンポーネントがアタッチされているオブジェクトがEnableになったタイミングでタイマーをリセット
    • LowPeriodTime(float):タイマーの最短期間
    • HighPeriodTime(float):タイマーの最長期間

このOnTimerはLowPeriodTime~HighPeriodTimeの間でランダムな時間にアクションが実行されます。
ランダムが嫌な場合はLowとHigh両方同じ値にすると良いでしょう。

  • OnEnterTrigger
    • Trigger Individuals(bool):trueの場合、オブジェクトが範囲内に入ったときいつでも発火します。
      falseの場合、すでに別のオブジェクトが範囲内に入っていた場合は発火しません。
    • Layers(enum(Flag)):Triggerが有効になるオブジェクトのレイヤーを指定。

Triggerを持つVRC_TriggerがColliderを持ち、ColliderのisTriggerがtrueの場合に、
他のisTriggerがオンになっているColliderが触れると発火します。

  • OnExitTrigger
    • Trigger Individuals(bool):trueの場合、オブジェクトが範囲外に出たときいつでも発火します。falseの場合、別のオブジェクトが範囲内に入っていた場合は発火しません。
    • Layers(enum(Flag)):Triggerが有効になるオブジェクトのレイヤーを指定。

Triggerを持つVRC_TriggerがColliderを持ち、ColliderのisTriggerにチェックが入っている場合に、他のisTriggerがオンになっているColliderが触れた後に範囲外に出ると発火します。

  • OnKeyDown
    • Key(UnityEngine.KeyCode):反応するキー(ゲームパッドのキーも反応可能)

キーボードのキーを押したときに発火する。

  • OnKeyUp
    • Key(UnityEngine.KeyCode):反応するキー(ゲームパッドのキーも反応可能)

キーボードのキーを離したときに発火する。

  • OnPickUp
    • Interaction Text(string):拾える状態のときに表示する文字列
    • Proximity(float):有効な距離

同オブジェクトのVRC_PickupでPickupされると発火する。

  • OnDrop
    • Interaction Text(string):離した状態のときに表示する文字列
    • Proximity(float):有効な距離

同オブジェクトのVRC_PickupでPickupされていたオブジェクトが離されると発火する。

  • OnInteract
    • Interaction Text(string):使える状態のときに表示する文字列
    • Proximity(float):有効な距離

プレイヤーが有効範囲内にいて、使用ボタンを押すと発火する。
PickupUseと違い、拾わない状態で使うものに使用する。

  • OnEnterCollider
    • Trigger Individuals(bool):trueの場合、オブジェクトが範囲外に出たときいつでも発火します。
      falseの場合、別のオブジェクトが範囲内に入っていた場合は発火しません。
    • Layers(enum(Flag)):Triggerが有効になるオブジェクトのレイヤーを指定。

TriggerではなくCollider(物理的な当たり判定)が当たったときに発火する。
プレイヤー(PlayerLayer)が当たっても発火しないので、
プレイヤーが当たったのを判定したい場合はOnAvaterHitを使用しましょう。

  • OnExitCollider
    • Trigger Individuals(bool):trueの場合、オブジェクトが範囲外に出たときいつでも発火します。falseの場合、別のオブジェクトが範囲内に入っていた場合は発火しません。
    • Layers(enum(Flag)):Triggerが有効になるオブジェクトのレイヤーを指定。

TriggerではなくCollider(物理的な当たり判定)が離れたときに発火する。
プレイヤー(PlayerLayer)では発火しないので、
プレイヤーを判定したい場合はOnAvaterHitを使用しましょう。

↑と公式に書いてありますが、OnAvaterExitはないんですよね。

  • OnDataStorageChange
    • Data Element(enum(VRC_DataStorage内のDataにある値名)):監視するデータを選択

VRC_DataStorageコンポーネントを同じオブジェクトに追加する必要がある。
そのVRC_DataStorage内で宣言されているデータを監視して変更があったときに発火する。

  • OnAvatarHit
    プレイヤー(Avatar)がColliderに当たったら発火する。

  • OnVideoStart
    ※公式に解説なし
    おそらくVRC_VideoPlayerでビデオが開始されたときに発火する。

  • OnVideoEnd
    ※公式に解説なし
    おそらくVRC_VideoPlayerでビデオが停止したときに発火する。

  • OnVideoPlay
    ※公式に解説なし
    おそらくVRC_VideoPlayerで再生されたときに発火する。

  • OnVideoPause
    ※公式に解説なし
    おそらくVRC_VideoPlayerで一時停止されたときに発火する。

  • OnDisable
    オブジェクトが無効(SetActive(true)やワールド生成時?)になったときに発火する。

  • OnOwnershipTransfer
    オブジェクトのオーナーが変更されたときに発火する。

  • OnParticleCollision
    ※公式に解説なし
    おそらくパーティクルの当たり判定に入ったときに発火する。
    OnCollisionのパーティクル用版かと。

アクション

アクションとは

トリガーが発火したときに行う処理のこと。

Basic Events
VRC_Action_BasicEvents.png

Events from Scene
VRC_Action_EventsFromScene.png

記述規則

  • アクション名
    • パラメータ名(型):説明

共通しているパラメータ

  • Receives(型):アクションを受け取るコンポーネントを指定する。指定するコンポーネントの種類はアクションにより異なる。

Basic Events

  • ActiveCustomTrigger

    • Receives(VRC_Trigger):
    • Name(string):呼び出すカスタムトリガー名(自分で指定している名前)
  • AddAngularVelocity

    • Receives(Rigidbody):角速度を加えるRigidbody
    • AngularVelocity(Vector3):加える角速度の強さ
    • UseWorldSpace(bool):加える角速度の向きが絶対方向(true)か相対方向か(false)

※公式に解説なし
角速度を与える。

  • AddDamage

    • Receives(GameObject):ダメージを与えるゲームオブジェクト
    • Damage(float):与えるダメージ量
  • AddForce

    • Receives(Rigidbody):力を加えるRigidbody
    • Force(Vector3):加える力の強さ
    • UseWorldSpace(bool):加える力の向きが絶対方向(true)か相対方向か(false)

※公式に解説なし
物体に力をかける。
AddVelocityとは違い、重さなども計算されて物体を動かす。

  • AddHealth

    • Receives(GameObject):回復させるゲームオブジェクト
    • Health(float):回復量
  • AddVelocity

    • Receives(Rigidbody):加速度を加えるRigidbody
    • AngularVelocity(Vector3):加える加速度の強さ
    • UseWorldSpace(bool):加える加速度の向きが絶対方向(true)か相対方向か(false)

※公式に解説なし
こちらは加速度を与えるアクションです。
重さなどは加味せず、加速度がそのまま加えられる。

  • AnimationBool

    • Receives(Animator):Animatorコンポーネント
    • Variable(string):セットする値の名前
    • Operation(enum(true, false, toggle)):どれをセットするか
  • AnimationFloat

    • Receives(Animator):Animatorコンポーネント
    • Variable(string):セットする値の名前
    • Operation(float):セットする値
  • AnimationInt

    • Receives(Animator):Animatorコンポーネント
    • Variable(string):セットする値の名前
    • Operation(int):セットする値

※公式に解説なし

  • AnimationIntAdd
    • Receives(Animator):Animatorコンポーネント
    • Variable(string):セットする値の名前
    • Operation(int):加える値

※公式に解説なし

  • AnimationIntDivide
    • Receives(Animator):Animatorコンポーネント
    • Variable(string):セットする値の名前
    • Operation(float):割る数の値

※公式に解説なし

  • AnimationIntMultiply
    • Receives(Animator):Animatorコンポーネント
    • Variable(string):セットする値の名前
    • Operation(float):掛ける数の値

※公式に解説なし

  • AnimationIntSubtract
    • Receives(Animator):Animatorコンポーネント
    • Variable(string):セットする値の名前
    • Operation(float):引く数の値

※公式に解説なし

  • AnimationTrigger

    • Receives(Animator):Animatorコンポーネント
    • Trigger(string):セットする値の名前
  • AudioTrigger

    • Receives(AudioSource):音声を再生するAudioSource
    • Clip(enum):再生する音声
  • CallUdonMethod

※公式に解説なし
※Unsupported event type

  • DestroyObject

    • Receives(GameObject):削除するゲームオブジェクト
  • PlayAnimation

    • Receives(Animation):再生されるアニメーションコンポーネント
    • Clip(string):再生するアニメーションクリップ
  • SendRPC

    • Receives(GameObject):実行されるGameObject
    • Targets(enum):対象となるプレイヤーの種類
  • SetAndularVelocity

    • Receives(Rigidbody):角速度をセットするRigidbody
    • AngularVelocity(Vector3):角速度
    • UseWorldSpace(bool):加える角速度の向きが絶対方向(true)か相対方向か(false)

※公式に解説なし

  • SetComponentActive

    • Receives(GameObject):対象のGameObject
    • Component(enum(MonoBehaviour)):対象GameObjectにアタッチされてるコンポーネント
    • Enable(enum(true, false, toggle)):セットするコンポーネントの状態
  • SetGameObjectActive

    • Receives(GameObject):対象のGameObject
    • Enable(enum(true, false, toggle)):セットするコンポーネントの状態
  • SetLayer

    • Receives(GameObject):対象のGameObject
    • Layer(enum):セットするLayer
  • SetMaterial

    • Receives(GameObject):対象のGameObject
    • Material(Material):セットするマテリアルアセット
  • SetParticlePlaying

    • Receives(GameObject):対象のGameObject
    • Operation(enum(true, false, toggle)):セットするコンポーネントの状態
  • SetUIText

    • Receives(Text):対象のテキスト
    • Text(string):セットする文字列

※公式に解説なし

  • SetVelocity

    • Receives(Rigidbody):加速度をセットするRigidbody
    • AngularVelocity(Vector3):セットする加速度
    • UseWorldSpace(bool):セットする加速度の向きが絶対方向(true)か相対方向か(false)
  • SetWebPanelURI

    • Receives(VRC_WebPanel):対象のVRC_WebPanel
    • URI(string):閲覧するURI文字列
  • SetWebPanelVolume

    • Receives(VRC_WebPanel):対象のVRC_WebPanel
    • Volume(float(Slider)):音量0~1
  • SpawnObject

    • Prefab(GameObject):生成するGameObjectプレハブ
    • Locations(Transform):生成する位置
  • TeleportPlayer

    • Receives(GameObject):プレイヤーの移動先

Events from Scene

VRC_ObjectSyncを持つオブジェクトがシーン上にあるときのみ有効。
というのも、SendRPC経由でGameObjectを対象に各アクションが行われるため。

  • EnableKinematic
    • Receives(GameObject):実行されるGameObject
    • Method(enum(実行する関数)):CustomMethod(固定でよい)
    • CustomMethod(string):実行する関数名(アクション名がデフォルトで入る)
    • Targets(enum):対象となるプレイヤーの種類

※公式に解説なし
RigidbodyのIsKinematicがオンになるかと思われる。

  • DisableKinematic
    • Receives(GameObject):実行されるGameObject
    • Method(enum(実行する関数)):CustomMethod(固定でよい)
    • CustomMethod(string):実行する関数名(アクション名がデフォルトで入る)
    • Targets(enum):対象となるプレイヤーの種類

※公式に解説なし
RigidbodyのIsKinematicがオフになるかと思われる。

  • EnableGravity
    • Receives(GameObject):実行されるGameObject
    • Method(enum(実行する関数)):CustomMethod(固定でよい)
    • CustomMethod(string):実行する関数名(アクション名がデフォルトで入る)
    • Targets(enum):対象となるプレイヤーの種類

※公式に解説なし
RigidbodyのUseGravityがオンになると思われる。

  • DisableGravity
    • Receives(GameObject):実行されるGameObject
    • Method(enum(実行する関数)):CustomMethod(固定でよい)
    • CustomMethod(string):実行する関数名(アクション名がデフォルトで入る)
    • Targets(enum):対象となるプレイヤーの種類

※公式に解説なし
RigidbodyのUseGravityがオフになると思われる。

  • ReapObject
    • Receives(GameObject):実行されるGameObject
    • Method(enum(実行する関数)):CustomMethod(固定でよい)
    • CustomMethod(string):実行する関数名(アクション名がデフォルトで入る)
    • Targets(enum):対象となるプレイヤーの種類

※公式に解説なし
Reap=刈り取る?
謎である。

  • TakeOwnership
    • Receives(GameObject):実行されるGameObject
    • Method(enum(実行する関数)):VRC_ObjectSync.TakeOwnership
    • Targets(enum):対象となるプレイヤーの種類

※公式に解説なし
オブジェクトの所有権を取得する。

  • TeleportTo
    • Receives(GameObject):実行されるGameObject
    • Method(enum(実行する関数)):VRC_ObjectSync.TeleportTo
    • Targets(enum):対象となるプレイヤーの種類
    • targetLocation(Transform):テレポート先

※公式に解説なし
指定したテレポート先にテレポートする。

  • Respawn
    • Receives(GameObject):実行されるGameObject
    • Method(enum(実行する関数)):VRC_ObjectSync.Respawn
    • Targets(enum):対象となるプレイヤーの種類

※公式に解説なし
オブジェクトをスポーンさせる。
複製か元あった場所に移動するだけかは不明。

  • FlagDiscontinuity
    • Receives(GameObject):実行されるGameObject
    • Method(enum(実行する関数)):VRC_ObjectSync.FlagDiscontinuity
    • CustomMethod(string):実行する関数名(アクション名がデフォルトで入る)
    • Targets(enum):対象となるプレイヤーの種類

※公式に解説なし
謎。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity初心者]マウスポインタの位置を取得

概要

マウスをクリックした時に、マウスポインタの座標をコンソールに表示します。

本文

    void Update()
    {
        if (Input.GetMouseButtonDown(0)) {
            Vector3 mousePos = Input.mousePosition;
            Debug.Log("x:"+mousePos.x+"    y:"+mousePos.y);
        } 
    }

Vector3型は
~.xでX座標
~.yでY座標
~.zでZ座標が取り出せます

スクリーンショット (73).png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

agora.io VideoSDK for Unity クイックスタートガイド

概要

agora.io に VideoSDK for Unity が公開されています。

Unity とは Unity Technologies が開発しているマルチプラットフォーム対応のゲームエンジンです。
Unity プロジェクトに VideoSDK を組み込むことで iOS/Android/MacOSX/Windows のアプリ開発が可能となります。
※ 開発には C# でのコーディングが必要となります。

この記事では VideoSDK に含まれているサンプルデモの使い方を紹介します。

準備する物

  1. AppID
    ※ agora.io からデベロッパー登録を行い取得する必要があります。

  2. 最新版の Unity Hub および 2017.4.35f1 以降の Unity
    ※ ユーザー登録が必要となります。

ビルド方法

SDK の入手

次のいずれかの方法で SDK を入手してください:
方法 1: Agora Developer Center から入手
方法 2: Unity Asset Store からインポート

方法 1

  1. Agora Developer Center の SDK Download ページから、最新版の VideoSDK for Unity をダウンロードします。
    image.png

  2. ダウンロードしたファイルを解凍し、適当なディレクトリの下に配置します。

  3. Unity Hub を起動した後 「ADD」 をクリックし、配置したディレクトリから 「Agora_Unity_SDK_FULL > samples > Hello-Video-Unity-Agora」 まで遷移します。
    image.png

  4. 「Select Folder」 を押してプロジェクトを追加します。

  5. 使用する Unity Version を選択し、プロジェクト名 (ここでは 「Hello-Video-Unity-Agora」) をクリックしてプロジェクトを開きます。
    image.png
    ※ 「プロジェクトをアップグレードしますか」 という内容のダイアログが出てきた場合、「Confirm」 を押して続行します。

方法 2

  1. 新規 Unity プロジェクトを作成します。

  2. Asset Store タブを開き、「Agora Video SDK for Unity」を検索します。

  3. 「Download」 をクリックし、完了すると 「Import」 に変わるので、再びクリックします。
    image.png

  4. Import Unity Package の画面が開くので 右下の「Import」 を押します。
    image.png

サンプルデモの起動

  1. プロジェクトが開いたのを確認し、Project タブから SceneHome をダブルクリックします。
    ※ AssetStore から SDK を入手した場合 「Assets > AgoraEngine > Demo」直下にあります。
    image.png

  2. Hierachy タブから GameController をクリックします。
    image.png

  3. Inspector タブ内に AppID を埋める欄が表示されますので、予め取得した ID を記入します。
    image.png

  4. 「File > Build Settings」 を開き 「SceneHome」「SceneHelloVideo」 の順番に表示されていることを確認します。
    ※ されていない場合は、シーン名をドラッグして入れ替え、Delete で消去、または Project タブから追加等で修正してください
    image.png

  5. Build Settings を閉じ、Project タブから SceneHome をダブルクリックして開きます。

  6. エディタ上部にある 「▶」 をクリックすることで、エディタ上から動作確認できます。
    image.png

  7. チャンネル名を指定し「Join」をクリックすると画面が切り替わり、下図のように自映像が表示されます。
    ※ 実際の画面と異なる場合があります
    image.png

最後に

agora.ioに関するお問い合わせはこちらから
スクリーンショット 0001-08-15 13.41.56.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

uGUIのTextMeshPro

概要

Unityのバージョンは2018.4LTS版

uGUIのTextMeshProについてのメモです。一通りの機能についての解説します。
Text - TextMeshPro を追加すると画面上のCanvasの子に Text(TMP) が追加されます。
TextMesh Pro がダウンロードされてない場合はメッセージが表示されるのでダウンロードする。
ダウンロードするとAssetにTextMesh Proフォルダが作られます。(TMP Examples&Extras の方はサンプル)
Text Mesh Pro UGUI のコンポーネントの内容は以下の通りです。

Text Mesh Pro UGUIコンポーネント

  • Text(テキストはリッチテキストタグをサポート)
  • Enable RTL Editor(文字の左右反転)
  • Font Asset(テキストのレンダリングに使用されるフォントアセット)
  • Material Preset(テキストのマテリアル)
  • Font Style(フォントのスタイル、大文字小文字設定もある)
  • Font Size(フォントサイズ)
    • Auto Size(拡大縮小されたときの最大と最低サイズを設定できる)
  • Vertex Color(ベースカラー)
  • Color Gradient(テキストにグラデーションを設定)
    • Color Preset(カラーデータをセットできる。一括設定するのに向いてる)
    • Color Mode(グラデーションの方向を設定)
    • Colos(カラーを設定)
  • Override Tags(使用用途不明)
  • Spacing Options(文字の間、行間、などの設定)
  • Alignment(文字の整列位置)
  • Wrapping(自動で改行するか)
  • Overflow(Wrapping=Disabled, Overflow=Ellipsis に設定するとはみ出した文字は...になる。他は使用方法が不明)
  • Horizontal Mapping(使用用途不明)
  • Vertical Mapping(使用用途不明)

Shader

  • Face
    • Color(文字色)
    • Texture(テクスチャの設定。Speedでアニメーションさせることができる)
    • Softness(輪郭をぼやかす)
    • Dilate(文字の太さ)
  • Outline
    • Color(アウトラインの色)
    • Texture(アウトラインにテクスチャ設定)
    • Thickness(アウトラインの太さ)
  • Underlay
    • Underlay Type(Innerの設定は効果不明)
    • Color
    • Offset X(影の基準位置)
    • Offset Y(影の基準位置)
    • Dilate(文字の太さ)
    • Softness(輪郭をぼやかす)
  • Lighting
    • Bevel(面取り設定)
    • Local Lighting(照明設定)
    • Bump Map(法線マップ)
    • Environment Map(環境マップ)
  • Glow(グロー効果)
  • Debug Setting(使用用途不明)

マニュアルは Asset > TextMesh Pro > Documentation のフォルダにPDFがあります。(ただし英語)
Examples & Extras にサンプルが入っているのでこれである程度使い方がわかる

設定項目がTextよりだいぶ多いので最低限設定するといい項目をあげる
- Vertex Color → 基本白(ほかのところでカラーを設定する)
- Color Gradient → グラデーションをつける
- Spacing Options → 文字間などを調整
- Shader > Face → 文字にテクスチャを設定。文字の太さを調整
- Shader > Outline → アウトラインをつける
- Shader > Underlay → 影をつける

Textとの比較

  • メリット
    • Textと違い拡大しても文字がぼやけない
    • アウトラインや影が奇麗につけられる
    • 文字の太さや間隔を調整できグラデーションカラーやアニメーションがつけられる
  • デメリット
    • フォントデータをそのまま使うわけではなく、フォントアセットを作成する必要がある
    • フォントアセットを使用するため使う文字をあらかじめ登録しないといけない(日本語入力に向いてない)

使い分けるとしたら
Text → どんな文字が入るかわからない場所(InputFeildの入力文字、お知らせ、利用規約など)
TextMeshPro → 定型文、ロゴ、スコア表示など

フォントアセットの作り方

Window > TextMeshPro > Font Asset Creator を選択

  • Font Settings
    • Source Font File(フォントファイル)
    • Sampling Point Size(テクスチャ生成のためのフォントサイズ)
    • Padding(文字間のパディング。512x512テクスチャーの場合、5のパディングで十分)
    • Packing Method(パッキング。高速 or 最適)
    • Atlas Resolution(アトラス解像度。解像度を高くするとグラデーションが細かくなる)
    • Character Set(フォントアセットに必要な文字を設定)
    • Render Mode(レンダリングのモード)
    • Get Kerning Pairs(特定文字の文字詰め情報を取得)

Generate Font Atlas を押すとフォントアセットの見本が表示される
Save を押してファイルに保存する

TextMeshProのSprict制御

  using TMPro;

  // テキスト文字の設定方法
  this.GetComponent<TextMeshProUGUI>().SetText("<size=50%>HP </size> {0}", 100);

参考になりそうなサイトやAsset

今後の課題

使いこなすにはある程度グラフィックの知識もいる
全機能を詳しく調べたわけではないので使用用途がわからないものがある
パフォーマンスについては未調査

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TextAssetに対応してない拡張子のファイルをInspectorで設定する

TextAssetは拡張子が特定のものじゃないと許容してくれない

テキストアセット ドキュメント

上記によるとTextAssetは

  • .txt
  • .html
  • .htm
  • .xml
  • .bytes
  • .json
  • .csv
  • .yaml
  • .fnt

をサポートしているそうで

今回xLuaというUnityでluaを扱うライブラリのサンプルをみているとluaのファイルの拡張子を.txtにしていた。テキストエディターで開いた際に設定をしなければハイライトなどが適応されないので.luaのままで設定できた方が楽じゃね?と思ったので作ってみました

LuaTextAsset.cs

そこで今回作ったのが.luaを許容するEditor拡張で上のgistで公開しています

xLuaのExample/02_U3DScriptingを変えて

  • LuaBehaviour.csのLuaScript変数の型をTextAsset → LuaTextAsset
  • LuaTestScript.lua.txt → LuaTestScript.lua

に変更させていますが正しく動いているのがわかります(実行が遅いのは低スペックmacなのでご愛嬌)
output.gif

中身

LuaTextAsset.cs
LuaTextAsset.cs
using System;
using System.IO;
using System.Text;
using UnityEngine;
using Object = UnityEngine.Object;
#if UNITY_EDITOR
using UnityEditor;
#endif

[Serializable]
public class LuaTextAsset
{

    public const string Extension = ".lua";

    [SerializeField] private string path;

    [SerializeField] private string textString;

    [SerializeField] private string byteString;

    public string text => textString;

    public byte[] bytes => Encoding.ASCII.GetBytes(byteString);

    public static implicit operator TextAsset(LuaTextAsset textAsset)
    {
        return new TextAsset(textAsset.textString);
    }

    public static implicit operator LuaTextAsset(TextAsset textAsset)
    {
        return new LuaTextAsset { textString = textAsset.text };
    }
}

#if UNITY_EDITOR
[CustomPropertyDrawer(typeof(LuaTextAsset))]
public class LuaInspectorEditor : PropertyDrawer
{

    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        var path = property.FindPropertyRelative("path").stringValue;
        var loaded = AssetDatabase.LoadAssetAtPath(path, typeof(Object));
        var field = EditorGUI.ObjectField(position, label, loaded, typeof(Object), false);
        var loadPath = AssetDatabase.GetAssetPath(field);
        var fileExtension = Path.GetExtension(loadPath);
        if (field == null || fileExtension != LuaTextAsset.Extension)
        {
            property.Set("path", "");
            property.Set("textString", "");
            property.Set("byteString", "");
        }
        else
        {
            var pathProperty = property.FindPropertyRelative("path");
            property.Set("path", loadPath.Substring(loadPath.IndexOf("Assets", StringComparison.Ordinal)));
            property.Set("textString", File.ReadAllText(pathProperty.stringValue));
            property.Set("byteString", Encoding.ASCII.GetString(File.ReadAllBytes(pathProperty.stringValue)));
        }
    }
}

public static class SerializedPropertyExtension
{
    public static void Set(this SerializedProperty property, string name, string value)
    {
        var pathProperty = property.FindPropertyRelative(name);
        pathProperty.stringValue = value;
    }
}

#endif

基本的にTextAssetと互換を保ちつつ、TextAssetと同じ変数名で扱えるように設定をしています。今回はluaに限定していますが少し変えれば好きな拡張子で設定が可能になると思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity初心者】関数(メソッド)って何? 

環境

Unity 2019.3.7f1

はじめに

メソッドは日本語でいうと関数
なかなか馴染みがない言葉ですよね。
今回は概略を説明していきます。

関数(メソッド)とは?

関数とは処理をまとめたものです。
ざっくり図にするとこんな感じです。
image.png

そして、大きくわけると次の2つに分かれます。
・C#やUnity側であらかじめ処理内容が用意されている関数
・自分で処理内容を決める関数
さらに返り値の有無引数の有無で細分化されていきます。
下図が関数の分類と使い方になります。(イベント関数は使い方が特殊なので別で書きました。)
image.png

全11種類です!(多いわ!)
1.用意されている関数-返り値有-引数必要
2.用意されている関数-返り値有-引数不要
3.用意されている関数-返り値無-イベント関数-引数必要
4.用意されている関数-返り値無-イベント関数-引数不要
5.用意されている関数-返り値無-引数必要
6.用意されている関数-返り値無-引数無-①
7.用意されている関数-返り値無-引数無-②
8.自作の関数-返り値有-引数有
9.自作の関数-返り値有-引数無
10.自作の関数-返り値無-引数有
11.自作の関数-返り値無-引数無

関数を使うと具体的に何ができるの?

大分類2種類でそれぞれ説明

C#やUnity側であらかじめ処理内容が用意されている関数
スクリーンサイズを取得したり、変数の値をコンソールに表示したり様々なことができます。

関数の種類については非常にたくさんありますので、
詳細はkimamaさんのサイトを参考にして下さい。↓
http://kimama-up.net/unity-functions-application/

自分で処理内容を決める関数
if文や四則演算やfor文などの自分のやりたい処理をひとまとめにすることができます。
・何回も同じコードを書かなくて良い
・コードが見やすくなる
といったメリットがあります。

使い方をちゃんと説明してよ

全11種類の関数の使い方、自作関数の作り方については今後記事作成していきます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

InputSystemでPress Any Keyを作る

概要

PC向けのゲームを真面目に作ろうとすると、キーボード、ゲームパッド、マウス他の対応。
特に全部に対応したタイトル画面のPress Any Keyを作るのが面倒くさいですよね。
各デバイスごとの決定キーだけ対応させるっていう手抜きもありえますが、新しいInputSystemなら取得に必要なコードは実質1行!
おそらくゲームパッド上のメニューボタンなどにも反応してしまうので使う場合はお気をつけて

環境

2019.3.6f1

ソース

    public class TitleManager : MonoBehaviour
    {
        private InputAction _pressAnyKeyAction = 
                new InputAction(type: InputActionType.PassThrough, binding: "*/<Button>", interactions: "Press");

        private void OnEnable() => _pressAnyKeyAction.Enable();
        private void OnDisable() => _pressAnyKeyAction.Disable();

        void Update()
        {
            if(_pressAnyKeyAction.triggered)
            {
                //シーン読み込み、アニメーション読み込みなどなど
            }
        }
    }

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む