20210504のUnityに関する記事は5件です。

UnityのTriLibで悩んだテクスチャの挙動について

現在、Unityで独自のVRMビューアを開発中なのだが、利用しようとして試している機能で悩んで原因がわかってきたので簡単にまとめてみた。 動的にFbxやObjを読み込めるアセット「TriLb2」というのがある。 TriLib2 - unity Asset Store ※参考記事 https://qiita.com/jyouryuusui/items/5d0f041fc635295640c8 やろうとしたこと 自作アプリの特徴として、VRMの他にVRMに取り付けたい小物も読み込めるようにして、動的にVRMに色々パーツを付けてポージングして遊べるようにしたい。  そこで3Dモデルの動的読み込みで有名なTriLib2の力を借りようと考えて導入した次第。 発覚した問題 今までVRoid作成時に作った小物Fbxを試しに読み込ませてテストしようとしたら・・・テクスチャやマテリアルが表示されないのだ! 試しに、アビス・ホライズン開発チームが公開しているFbxを読み込ませてみると正常に表示される。  最初はTriLib2の利用の仕方、コーディング方法でミスがあるのかと思ったが、他所様のFbxが正常に読み込めるので、TriLib2の利用の仕方にミスはない模様。 ファイル・フォルダの構成を確認 TriLib2に読み込ませるのにfbx単体ではダメ?明示的にフォルダを構成しなければいけないのか?と思って逸仙のFbxに倣ってフォルダを構成し、Zip圧縮してみたがやはりダメ。 逸仙のFbxのフォルダ構成 これを真似たが別にフォルダ構成が重要とかそういうわけではないと察した。 Blenderで設定を確認  Blenderで各設定を見直してみた。 アビス・ホライズン逸仙のFbx=プリンシプルBSDF 自作のVRoid用小物のFbx=MToon_universioned シェーダーが明らかに違う。 そこで試しに自作の小物FbxのシェーダーをプリンシプルBSDFに設定し直して、TriLib2で読み込ませてみた。 (本当はマテリアルの設定も怪しいが後でそこは変更しなくても今回の問題には影響なかったのでスルーした) 正常に表示されるようになった!Asset Unloaderでもマテリアルの画像のサムネイルが認識されるようになっている。 上図のうち、要素1の「base_color_texture」にあたる部分がいままではサムネの色がなくブランクだった。 結論  TriLib2はVRoid/VRMのMToonシェーダーには対応していないことがわかった。TriLib2で動的にFbxやObjなどを読み込ませたかったから、VRoid用だとしてもプリンシプルBSDFなどの一般的なシェーダーにする必要ありそうだ。  ただVRoidにMToon以外のシェーダーを設定した3Dモデルを寄り添わせると雰囲気が違ってくる。テクスチャの雰囲気がMToonとそれ以外では違うのだ。ゲームなどでの利用では作風の問題にも影響してくる可能性がある。  もちろん動的にゲーム中に3Dモデルを読み込ませるなんて、よほどのことだろう。自分はその「よほど」の特殊事例なだけかもしれない。  あと、VRoidSDKをプロジェクトに導入していると、TriLib2はnewtonsoft.JSON.dllが競合するのでビルド時にエラーが出るので要注意。(自分はまだ解決に至っていないが、VRoidSDKがアプリに不要だとわかったので削除して事なきを得た。)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

unityでスマホゲーム制作までのお勉強用記録記事1

今日から毎日勉強の記録を保存していくだけのメモ帳 現在unityで2Dマリオの用なゲームを練習で1本作成した。 しかし作成期間が長かったので結構忘れてることが多く、新しいゲームを作るのが困難だったため再度記録用も含めて記事を作成。 1日中家にいない日もあるので、そういう日以外で記録を付けていきます。 Void_Start() { Debug.Log("ゲーム制作がんばるぞ!"); }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

XR Interaction Toolkitでコントローラーを振動させる方法(調査中)

はじめに XR Interaction Toolkitでコントローラーを振動させる方法を調べています。 2021/05/04 まだ調査中です 本題 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR.Interaction.Toolkit; public class HandControllerViveration : MonoBehaviour { public XRController deviceBasedController; public XRBaseController actionBasedController; private void ControllerViberation() { //Device-Basedの場合、コントローラーを1.0秒振動させる deviceBasedController.inputDevice.SendHapticImpulse(0, 1.0f); //Action-Basedの場合、コントローラーを1.0秒振動させる actionBasedController.SendHapticImpulse(0, 1.0f); } } これでコントローラーが振動するはずですが、なぜか振動しないんですよね... 終わりに 解決したら更新します! 参考リンク https://forum.unity.com/threads/xr-interaction-toolkit-hover-event-on-ui-elements-with-xrrayinteractor.852409/ https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@1.0/api/UnityEngine.XR.Interaction.Toolkit.XRController.html https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@1.0/api/UnityEngine.XR.Interaction.Toolkit.XRBaseController.html https://gaprot.jp/2021/03/30/xr-interaction-toolkit/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Oculus Quest 開発TIPS】テレポートやGUI操作を簡単に解決する

要約 Oculus Quest での開発初期に、こういうのとりあえず実装したいみたいになりませんか? テレポートしたい 水平移動したい レーザーでGUIを操作したい バーチャルキーボードで入力したい 3Dオブジェクトを選択したい Oculus Integration に含まれているサンプルを利用することで簡単に解決できます。 解決方法だけでなく、ある程度の範囲が調整できるので、それらも含めた紹介です。 前提 Name Version Unity 2019.4.9f1 Oculus Integration 25.0 Oculus Quest 1 or 2 テレポートしたい いきなり他の方の実装方法の紹介になりますが、 Oculus Integration を用いた テレポート / ワープ の実装方法 [Oculus Quest] が詳細でわかりやすいです。 操作方法 右手のスティックを倒すとテレポート後のポイントが表示され、スティックを離すとテレポートします。 右手のスティックを倒している方向で、テレポート後の向きが決まります。 サンプルでこんな調整もできます テレポートできる最大距離を設定することが可能です。 TeleportAimHandlerLaser の Range を変更してください。単位はメートルです。 直線レーザーだけでなく、釣り竿式の間がレーザーも出力できます。 TeleportAimHandlerLaser の代わりに、TeleportAimHandlerParabolic を設定してください。 テレポート後の回転はなくすこともできます。 TeleportOrientationHandlerThumstic の Thumbstick に None を設定してください。 補足 上記手順で実行すると正常に動いているように見えますが、裏で NullReferenceException が出ていました。 CharacterCameraConstraint で OVRScreenFade の参照がないので出ているエラーでした。同じオブジェクトに OVRScreenFade を追加して参照を入れてあげれ解決されます。 水平移動したい テレポートの設定方法 がされている前提です。 SimpleCapsuleWithStickMovment の Speed を0より大きい値で設定してあげてください。 左手のスティックで移動できるようになります。 操作方法 左手のスティックを倒すと、前後左右に水平移動します。 サンプルでこんな調整もできます Speed と書いてある通り、値を大きくすると移動スピードが大きくなります。 水平移動はVR酔いしやすいので取扱注意です。 個人的には Speed=1 とか遅すぎても酔いやすい気がしています。 おまけ デフォルトの設定では SimpleCapsuleWithStickMovement の RotationAngle に 45 が設定されています。これは右手のスティックを左右に倒すと回転する角度です。0 にすることでオフにすることができます。 レーザーでGUIを操作したい 操作したい uGUI のキャンバスに OVRRayCaster を設定します。 Oculus/SmapleFramework/Core/DebugUI/Prefabs/UIHelpers を操作したい手に入れます。 UIHelpers を展開するとその下に EventSystem が含まれています。これが VR 用の EventSystem となります。 EventSystem に設定されている OVRInputModule に以下設定を入れます。 既存の EventSystem は削除します。 操作方法 OVRRayCaster を設定したキャンバス上に、通常の uGUI のつもりでボタン等を設置していくだけです。 UIHelpers だけでレーザーも出るようになっています。 右手から出ているレーザーでキャンバス上のボタンを指し示した状態で、右手のトリガーをひけば、ボタンをクリックできます。 サンプルでこんな調整もできます 右手に入れたUIHelpersを左手に入れれば左手で操作できます。 Secondary -> Primary に変更すれば左手で決定できます。 おまけ Canvas を左手、あるいは頭と連動させることで、移動してもついてくるよなUIも作れます。(サンプルにはありませんが・・・) バーチャルキーボードで入力したい。 レーザーでGUIを操作したいができている前提です。 OVRCameraRig に設定されている、OVRCameraManagaer にある以下設定のチェックボックスを ON にします。 InputField への Text 入力は超簡単 以上!! 操作方法 uGUIにインプットフィールドを作っておいて、レーザー選択(トリガーを押す)とバーチャルキーボードが表示されます 私が実行した限り Go とかのボタンは効かず、元に戻るときは一番下のキーボードみたいなボタンを押していました 3Dオブジェクトを選択したい? VRPhyisicsRaycaster を利用して選択する方法も Oculus が準備している方式で、サンプルにも含まれています。ただ以下理由から私自身は採用するのをやめました。 基になっている UnityEngine.EventSystems が Unity 2019.4 版からドキュメントがありません。これ以上伸びないかもしれないAPIを利用するのは負債にしかならない気がしました。 Ray がヒットされるほうにイベントを書くので、GUI 的な使い方なら問題ないかなと思いますが、ヒットさせたほうで何かしたい時にはコードが歪になるかなと思いました。 それでもやるなら レーザーでGUIを操作したいができている前提です。 OVRCameraRig が入っているコンポーネントのころに、OVRPhysicsRaycaster を追加します。 OVRPhysicsRaycaster が OVRCameraRig を前提としています 以下コードを書いて、レイキャスト されるほう(するほうじゃなくてされるほう) に設定します。 public class PointerButton : MonoBehaviour, IPointerEnterHandler, IPointerClickHandler, IPointerExitHandler { [SerializeField] private TextMeshProUGUI text1; [SerializeField] private TextMeshProUGUI text2; public void OnPointerEnter(PointerEventData eventData) { text1.text = "Raycast hit :) at Plane"; } public void OnPointerExit(PointerEventData eventData) { text1.text = "Raycast out :( at Plane"; } public void OnPointerClick(PointerEventData eventData) { var obj = eventData.pointerCurrentRaycast.gameObject; var pos = eventData.pointerCurrentRaycast.worldPosition; text2.text = $"{go.name}({obj}) is Clicked!"; } } 参考 How to check if Oculus Go controller on OVRInputModule is clicking on GUI object or not Furthermore, whatever "Event Mask" you select for your OVRPhysicsRaycaster in the camera rig, any normal (non-UI) 3D object that is in that layer will detect the same IPointerEnterHandler and IPointer...Handler events just like a UI button, so you can use the same code for those objects as well, not just the UI objects. 他の方法で選択したい こちらの Oculus Goでコントローラ操作(3DオブジェクトとuGUI) を参考にすればとわかりやすいかと思います。 他参考 How do I use Oculus Quest controllers for clicking on Buttons? という stack overflow の記事 IPointerClickHandler など
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity error CS0619】Standard Assetsをインポートしたときのエラーの解決方法

動画 エラーテキスト Assets\Standard Assets\Utility\SimpleActivatorMenu.cs(10,16): error CS0619: 'GUIText’ is obsolete: 'GUIText has been removed. Use UI.Text instead.’ ↓ 「GUIText は廃止されました」 GUITextは削除されました。代わりにUI.Textを使用してください。 日本語に訳すとこう書いています。 解決法 1.エラーで指定されたファイルを開く SimpleActivatorMenu.csを開く。 エラーコードをダブルクリックすると、目的のファイルを開いてくれます。 2.GUI.TextをTextに変更する。 SimpleActivatorMenu.cs内の public GUI.Text camSwitchButton; を public Text camSwitchButton; に変更。 3.UnityEngine.UIを追加する 同じくSimpleActivatorMenu.cs内に using UnityEngine.UI: の一行を追加する。 変更後のSimpleActivatorMenu.cs SimpleActivatorMenu.cs using System; using UnityEngine; using UnityEngine.UI; // 追加 namespace UnityStandardAssets.Utility { public class SimpleActivatorMenu : MonoBehaviour { // An incredibly simple menu which, when given references // to gameobjects in the scene public Text camSwitchButton; // GUIText -> Textに変更 public GameObject[] objects; private int m_CurrentActiveObject; private void OnEnable() { // active object starts from first in array m_CurrentActiveObject = 0; camSwitchButton.text = objects[m_CurrentActiveObject].name; } public void NextCamera() { int nextactiveobject = m_CurrentActiveObject + 1 >= objects.Length ? 0 : m_CurrentActiveObject + 1; for (int i = 0; i < objects.Length; i++) { objects[i].SetActive(i == nextactiveobject); } m_CurrentActiveObject = nextactiveobject; camSwitchButton.text = objects[m_CurrentActiveObject].name; } } } おわり 修正後はファイルを保存してUnityに戻るとエラーが治っているはずです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む