タグ

ブックマーク / nekojara.city (40)

  • 【Unity】WebGLで動画再生を独自実装する

    Unity標準のVideoPlayerを使わずにWebGLで動画再生する処理を自作したいの。 標準のVideoPlayerの内部実装を参考に自作する方法を見ていくね。 WebGL環境において、Unity標準のVideoPlayerのような動画再生機能を自作する方法の解説記事です。 次のような動画再生をjslibプラグインでネイティブ実装して実現するところを目指します。 Unityでは、動画再生機能はVideoPlayerコンポーネントとして提供されており、WebGL含めたあらゆるプラットフォームでの再生が可能です。 参考:Unity – Scripting API: VideoPlayer 通常の動画再生であれば、Unity標準のVideoPlayerコンポーネントで事足りる場面も多いと考えられますが、動画再生をネイティブ実装することで次のようなことが期待できるかもしれません。 ネイティブ

    【Unity】WebGLで動画再生を独自実装する
  • 【Unity】Input Systemでシングルタップとマルチタップを判別する

    マウスのシングルクリックとダブルクリックのどちらかを判定する方法を知りたいの。 Input SystemのInteractionを活用すれば出来るわ。シングルクリック判定との共存をどう解決していくかを交えて解説していくわ。 Input Systemの環境下でマウスやタッチパネルのクリック・タップとマルチクリック・マルチタップを判別する方法の解説記事です。 判別方法としては、主に次の2種類が考えられます。 判別方法 シングルタップとマルチタップのイベントを同時に拾う シングルタップ判定の遅延が無いが、マルチタップ時にシングルタップのロールバックが必要 シングルタップとマルチタップのイベントを排他的に拾う ロールバック処理は不要だが、シングルタップ判定まで遅延がある それぞれの方法には一長一短があり、状況に応じて使い分けるのが適切でしょう。 このようなシングルタップとマルチタップの判別方法は、

    【Unity】Input Systemでシングルタップとマルチタップを判別する
  • 【Unity】スプラインに沿ってメッシュを変形させる

    Unity提供のスプラインに沿ってメッシュを変形させる方法を知りたいの。 スクリプトで自作する必要があるけど可能だわ。今回は基的な部分を解説していくね。 Unity公式のスプライン(Splinesパッケージ)に沿ってメッシュを変形させる方法の解説記事です。 次のように、既存のメッシュをスプライン曲線に沿って変形させるところを目標とします。 処理の実装方法は一通りではありませんが、記事では次の方法でメッシュ変形を実現するものとします。 メッシュ変形の実現方法 スクリプトからMeshオブジェクトにアクセスし、頂点と法線を書き換える スプライン上の位置や傾きなどはSplineオブジェクトから取得する 全てメインスレッドのCPU上で処理する スプラインに沿ってメッシュを作成するコンポーネントとしてSpline Extrudeがありますが、これはチューブ状のメッシュを生成する機能のため、上記のメ

    【Unity】スプラインに沿ってメッシュを変形させる
  • 【Unity】Input Systemの仮想カーソルをローカルマルチで扱う方法

    ローカルマルチで複数プレイヤーが仮想カーソルで選択する画面を作りたい場合どうすればいいの? Input System提供のVirtual MouseとPlayer Inputを組み合わせて実現できるわ。 Input Systemでは仮想カーソル用のコンポーネントVirtual Mouseが提供されていますが、ローカルマルチなど複数プレイヤーがそれぞれカーソルを操作する場面では少し工夫が必要です。 やや面倒ですが、プレイヤー毎にVirtual MouseとPlayer Inputをシーンに配置して、操作対象を紐づける設定をスクリプト側から行えば実現可能です。 また、動画の例の様にカーソルをUIとして画面に配置する場合、いくつか運用の制約があり注意が必要です。 記事では、この注意点含めローカルマルチでプレイヤー毎の仮想カーソルを動かす方法について解説します。 動作環境 Unity 2023.

    【Unity】Input Systemの仮想カーソルをローカルマルチで扱う方法
  • 【Unity】Input Systemでプレイヤーに複数デバイスを割り当てる

    シングルプレイ、またはローカルマルチで一人のプレイヤーに複数コントローラーを割り当てるにはどうすればいいの? 複数デバイスを割り当てたControl Schemeを用意して適用すれば良いわ。 Input SystemのPlayer Input使用下において、1プレイヤーに複数デバイスを割り当てる方法の解説記事です。 次のような使い方を想定します。 想定する場面 キーボード&マウスでプレイヤーを操作する ゲームパッドとマウスを割り当てる(モンゴリアンスタイル) タッチパネルと物理キーボードを使用する 複数プレイヤーに複数コントローラーを割り当てる このようなデバイスの組み合わせは、Input Action AssetのControl Schemeの設定から自由に変えられます。 参考:Input Action Assets | Input System | 1.7.0 記事では、各プレイヤー

    【Unity】Input Systemでプレイヤーに複数デバイスを割り当てる
  • 【Unity】UI操作をInput Systemのローカルマルチに対応させる

    複数プレイヤーの選択画面で、複数コントローラーで同時にUIを操作するにはどうすればいいの? PlayerInputとMultiplayerEventSystemを使えば可能だわ。順を追って解説していくね。 複数コントローラーを接続したローカルマルチの環境で、UIを個別のコントローラーで操作する方法の解説記事です。 次のように、プレイヤー毎に割り当てられたゲームパッドなどでUIを選択したり決定したりする操作をさせることを想定します。 操作対象のUIは、例えば1P用、2P用で排他的に操作したり、共存させたりする事が可能です。 記事では、このような複数プレイヤーによるUI操作をInput Systemで実現する方法を解説していきます。 動作環境 Unity 2023.2.16f1 Input System 1.7.0 目次 非表示 前提条件 UI操作の実現方法の概要 設定手順 Event Sy

    【Unity】UI操作をInput Systemのローカルマルチに対応させる
  • 【Unity】Input Systemでキーリピートを実現するInteraction

    Input Systemでボタンを押しっぱなしにした時、「タン、タタタタタン」と反応させるようにしたいの。 キーリピートだね。やり方は色々あるけどInteractionを作って実装する方法を解説していくね。 Input Systemでキーリピートを実現する方法の解説記事です。 記事で解説するキーリピートは、ボタンを押しっぱなしにすると、押してからワンクッション置いて連打されるような挙動を想定しています。 実装方法は一通りではありませんが、Input Systemの機能であるInteractionを自作して実現すると、次のようなメリットがあります。 主なメリット 様々なボタン操作(Action)などに対してキーリピート設定を適用可能になる ゲームロジックと入力ロジックを綺麗に分離できる スティック入力などボタン以外にも適用可能 Input SystemのInteractionは、長押しやダ

    【Unity】Input Systemでキーリピートを実現するInteraction
  • 【Unity】Input Systemで独自デバイスを実装する

    Input Systemで独自のコントローラーを作って使いたいの。例えば仮想コントローラーなどを作りたいの。 可能だわ。InputDevice継承クラスを実装してInput Systemにデバイス登録すれば使えるようになるわ。 Input Systemでカスタムデバイスを実装する方法の解説記事です。 カスタムデバイスはInputDevice継承クラスを実装し、これをInput System側に登録すると使えるようになります。 [InputControlLayout(displayName = "My Device", stateType = typeof(MyDeviceState))] public class MyDevice : InputDevice { // カスタムデバイスの実装 // デバイスの登録・解除処理など } 独自デバイスが認識されている様子 独自デバイスを実装するこ

    【Unity】Input Systemで独自デバイスを実装する
  • 【Unity】Input Systemでクリック/タップされた座標を取得する

    マウスカーソルがクリックされたら、その位置を取得するようなコードを書くにはどうすればいいの? いくつか方法はあるけど、クリックされた瞬間などにコールバック側からマウス位置を取得する処理を書けば良いわ。 Input Systemでマウスカーソルのクリック位置や、画面タップされた位置などを取得する方法の解説記事です。 方法は一通りではありませんが、次の方法があります。 クリック位置を取得する方法 クリックされた瞬間にポインタ位置を取得する カスタムComposie Bindingを実装する 1つ目の方法は、Input Systemを拡張せずに手軽に実現できる基的な方法ですが、いくつか注意点もあります。 2つ目の方法は、Input Systemを拡張する必要がありますが、受け取り側のコードがシンプルになるメリットがあります。 いずれもタップやマルチタップ、長押しなどの操作にも対応しています。

    【Unity】Input Systemでクリック/タップされた座標を取得する
  • 【Unity】Input Systemでスティック入力を受け取る

    Input Systemゲームパッドやジョイスティックなどのスティック入力を取得する方法の解説記事です。 スティック入力は横方向(x軸)と縦方向(y軸)の2軸の入力値として得られます。 // ゲームパッド(デバイス取得) var gamepad = Gamepad.current; if (gamepad == null) return; // ゲームパッドの左右のスティックの入力値を取得 Vector2 leftStick = gamepad.leftStick.ReadValue(); Vector2 rightStick = gamepad.rightStick.ReadValue(); 通常、スティックの2軸入力は、プログラム中ではVector2型として扱います。Input Actionでは、Gamepad配下のleftStickやrightStickを設定すれば良いです。 ステ

    【Unity】Input Systemでスティック入力を受け取る
  • 【Unity】RectTransform.sizeDeltaの仕様と注意点

    RectTransformのsizeDeltaは正確にはサイズではないわ。サイズとアンカーサイズとの差分を意味するものなの。 Unity UI(uGUI)などで使われるRectTransform.sizeDeltaプロパティは、そのRectTransform自体の矩形サイズではなく、矩形サイズからアンカーサイズを引いたものです。 アンカーが矩形より小さい場合 アンカーが矩形より大きい場合 sizeDeltaはサイズと説明される場合がありますが、これは不正確な表現です。sizeDeltaが矩形サイズとして振る舞うのは、アンカーサイズが0の場合に限ります。 試しにUIのアンカーをstretch(アンカーサイズが0でない)に設定すると、RectTransform.sizeDeltaプロパティが実サイズとは異なる結果になる事が確認できます。 アンカーにStretchが設定されている場合 記事では

    【Unity】RectTransform.sizeDeltaの仕様と注意点
  • 【Unity】Input Systemのデバイス管理の仕組み

    Input Systemで扱うゲームパッドやキーボードなどはどのように管理されるの?できれば内部の仕組みも教えてほしいの。 これはデバイスとして管理されるわ。詳しく解説していくね。 Input Systemでは、マウスやキーボード、ゲームパッドなどの物理コントローラーはデバイスとして扱われます。 Input Systemでサポートするデバイスには、次のようなものが存在します。 サポートされるデバイス(一部) キーボード ゲームパッド ジョイスティック マウス ペン タッチスクリーン センサー(ジャイロや温度など) このような物理コントローラー以外にも、仮想カーソルなどもデバイスとして扱うことが可能です。 上記で物足りない場合、デバイスを自作することも可能です。これにより、既存のデバイスだけでは対応できない物理コントローラーや好みの仮想コントローラーなどをInput System側から扱える

    【Unity】Input Systemのデバイス管理の仕組み
  • 【Unity】Input SystemでUI操作との競合を防ぐ方法

    UIのボタンを押す時だけInput Systemのクリックを反応させたくない場合、どうすればいいの? カーソルや指の位置がUI上にあるかどうかチェックすれば良いわ。Event Systemのレイキャストなどの機能を活用できるわ。 Unity UI(uGUI)とInput Systemを併用している環境において、UI操作時にマウス左ボタンなどの入力を無効化する方法の解説です。 普通に実装すると、UIのボタンをクリックした時に、Input System側のマウスの左ボタンなどの入力が反応してしまいます。 UI操作と競合している様子 これは、Input System側は特にUI操作関係なしに入力値を返す挙動になっているためです。 このような場合、ボタン入力を取得する際にマウスカーソルや指などがボタンの上にあるかどうかを判定し、上にない時だけ入力を受け付けるようにする必要があります。 また、Inp

    【Unity】Input SystemでUI操作との競合を防ぐ方法
  • 【Unity】WebGLで動画再生のフォールバックを実現する

    WebGL環境でWebM形式の動画再生に対応したいの… 再生できない時だけMP4動画に切り替えたりできないの? UnityのWebGLビルドで複数形式の動画再生をフォールバックで対応する方法の解説記事です。 記事の内容を実践すると、ブラウザによって最適な形式の動画を選択して再生することが可能になります。 例えば、HTMLの<video>タグによるWebM形式動画の再生では、Opera miniは非対応、iOS版Safariは部分的に対応というステータスになっています。 [1] 参考:“WebM” | Can I use… Support tables for HTML5, CSS3, etc このような場合、WebM対応ブラウザではWebM形式動画、非対応ブラウザではMP4形式動画にフォールバックして再生させれば良いです。 これは、HTMLで言う<video>と<source>タグによる

    【Unity】WebGLで動画再生のフォールバックを実現する
  • 【Unity】Input Systemの入力値の型をチェックする

    private void OnPerformed(InputAction.CallbackContext context) { // 入力値を取得 var inputValue = context.ReadValue<float>(); // TODO : 入力値を使って何か処理する } 実際にAction側から受け取れる値は、取得先のControl(ボタンやスティックなど)によって型が異なる場合があります。 例えば、上記のfloat型の入力値として取得するコードに対し、次のようにスティックなどの2軸入力(Vector2型)をActionから受け取れるようにすると実行時エラーとなります。 InvalidOperationException: Cannot read value of type 'float' from control '/XboxOneGampadMacOSWireless

    【Unity】Input Systemの入力値の型をチェックする
  • 【Unity】Line Rendererで破線を描画する

    破線を表示する方法を教えてほしいの。できればLine Rendererから手軽に使えれば最高だけど… Unity提供のLine Rendererで破線を描画する方法の解説記事です。 記事の内容を実践すると、次のような破線を描画できるようになります。 Line Renderer自体には破線を表示する機能はなく、表示に使われるメッシュは実線です。 そのため、破線を表示するためにはマテリアル側で対処する必要があります。 Line Rendererで破線を表示するには次の手順を実施すれば良いです。

    【Unity】Line Rendererで破線を描画する
  • 【Unity】Input SystemのInteractionの仕組みと使い方

    Interactionはボタンが押された瞬間や、ダブルクリックされたかどうかなど特定の入力パターンを判定する仕組みだわ。中身の動きと共に詳しく見ていくね。 Input Systemの基機能の一つとして、Interactionがあります。 これは、次のような特定の入力パターンを検知するための仕組みです。

    【Unity】Input SystemのInteractionの仕組みと使い方
  • 【Unity】Input Systemで連打を判定するInteraction

    Interactionを自作すれば可能だわ。Interactionにする事で色々な場所で連打判定を手軽にできるようになるわ。 Input Systemでボタン連打を判定する方法の解説記事です。 実現方法は一通りではありませんが、Input System環境下ではInteractionとして連打判定させることが出来ます。 Interactionは長押しやマルチタップなど特定の入力パターンを判定する役割を持ちます。 参考:Interactions | Input System | 1.5.1 Interactionにはこのようなプリセットが幾つか存在しますが、連打され続けているかどうかを判定するInteractionは存在しません。 [1] 記事では、次のような挙動の連打判定Interactionを自作する方法を紹介します。

    【Unity】Input Systemで連打を判定するInteraction
  • 【Unity】Input Systemで任意の入力を取得する

    Input Systemで「Press any key」のように、どれかのボタンが押されたかどうか判定したいの… Input Systemゲームパッドやキーボードなどの任意ボタンが押されたかどうかを判定する方法の解説記事です。 結論を述べると、次のようにInput Actionに設定するBindingなどのControl PathにLayout名やワイルドカードを用いると実現可能です。 ゲームパッドの任意ボタンを表すControl Path

    【Unity】Input Systemで任意の入力を取得する
  • 【Unity】Input Systemの入力をawaitで待機させる

    UniTaskのUniTaskCompletionSourceを使えばこの辺がスマートに実装できるわ。 // 対象のAction [SerializeField] private InputAction _action; private void Start() { // ここでコールバック登録 _action.performed += OnPerformed; } // ボタンが押されるたびに呼ばれる処理 private void OnPerformed(InputAction.CallbackContext context) { print("Performed"); } コールバック経由で入力値を受け取る場合、例えばボタンが指定順序通りに押されたか判定するケースでは、ステートマシンの実装やコールバックのネストを行う必要が出てくるかもしれません。 このような問題は、C#のasync/a

    【Unity】Input Systemの入力をawaitで待機させる