20211124のUnityに関する記事は8件です。

Unity プレイ時に音が同時に一つしか再生されない現象の対処法

OSがMacの場合 Edit/ProjectSettingsを開き、Audioをクリック。 MaxRealVoicesが1になっていたら、その数値を上げる。16とか。 これで解決しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity × ARでボールが跳ね返らないときは

UnityでARブロック崩し的なやつを作ろうとしたら、下のgifのようにボールが壁にあたっても全く跳ね返らない。「Unity ブロック崩し」で検索して出てきた通りにPhysics Material等を設定しても一向にだめ。 結論 UnityにおけるオブジェクトのScaleはm単位なので、ARで現実空間に表示する際はScaleを小さい値に設定することが多い。今回もUnity上でオブジェクトのScaleを0.05(5cm)とかに設定し、それに合わせてボールの速度も0.15(15cm/s)に設定していた。ところが、Unityには処理のオーバーヘッドを減らすために速度の遅すぎるオブジェクトの物理演算ををカットする設定があるらしく、今回は跳ね返りに関するBounce Thresholdに引っかかっていた(参考:Unityマニュアル)。 Bounce Threshold 速度の値を設定します。 2つの衝突するオブジェクトの相対速度がこの値より小さい場合、オブジェクトは互いに跳ね返りません。この値はジッタも減少させるため、非常に低い値に設定することは推奨されません。 デフォルトではBounce Thresholdが0.2になっており、ボールの速度0.15がちょうど閾値を下回っていたため跳ね返らなくなっていた。 解決策 UnityメニューのEdit->Project Settings->Physicsを開き、Bounce Thresholdの値を小さくする。今回はボールの速度が0.15なのでそれより小さい0.1に設定した。 結果、下のgifのように見事宇宙飛行士が宙を舞うようになった。 余談 Bounce Thresholdの他にSleep Thresholdという値もある。 Sleep Threshold キネマティックでないリジッドボディがスリープ状態になる可能性があるグローバルエネルギーの閾値を設定します。リジッドボディがスリープ状態のときはフレーム毎に更新されるわけではないため、リソースの負担は少なくなります。 リジッドボディの運動エネルギーを質量で割った値がこの閾値を下回る場合、スリープの候補となります。 運動エネルギーを参照するため、速度を更に遅くしたり質量を下げたりすると引っかかる可能性がある。 環境 macOS Big Sur Unity2019.4.28f1 AR Foundation 3.1.0
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RealWear上で動かしてるUnityアプリの自動回転が反応しなくなる問題の解決

環境 RealWear Androidが搭載されたヘッドマウントディスプレイ Unity2018 問題 RealWearは左右の目どちらでも使用できるように端末の上下に合わせて画面を自動回転してくれる機能が備わっている。 自動回転自体は端末の設定でON/OFF可能 しかし、Unityで作成したアプリを起動しているとき、自動回転をONにしていてもある条件で自動回転が効かなくなる。 自動回転が効かなくなる条件はロール軸に上下を逆さまにしたとき 逆さまにしたタイミングで一度だけ自動回転が発生するが、その後は上下を逆さまにしても自動回転が効かなくなる。 自動回転が効かなくなっているのはアプリレベルの話であるため、他のアプリでは自動回転は動作するし、該当アプリを再起動すれば再び自動回転は効くようになる。 解決策 UnityエディタからBuild settings > Player Setiingsを開き、 settings for Android > Resolution and Presentationの中の - OrientationをAuto Rotationに - Allowed Orientations for Auto RotationのPortraitとPortrait Upside Downのチェックを外し、Landscape RightとLandscape Right/Leftだけにチェックをつける おそらくRealWearでは横向きが画面しか対応しておらず、ロール軸回転によって一瞬でも縦向きという状態になると、それを正しく処理できず自動回転機能に不具合を起こすのではないかと予想している。 そのため、アプリの設定で縦向きを除外してやることでこの問題の発生を抑えられているのだろう。 あとがき 今回は仕事の関係でRealWearという一般ではあまり利用されていないハードウェアの開発に携わることになり上記の問題に直面した。 RealWearの情報は公式ドキュメントと日本の販売代理店のもの以外はほぼ存在せず、特にこういった細かい不具合については一切参考になるものがなかったため、今後RealWear × Unityで開発を行う人の助けになればと思い記事を書いた。 この記事のニーズは日本の中では1人もいないかもしれないが、いつか誰かの役に立つことを願っている。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity アセットの買い方

仕事の一環でUnityのアセットを初めて購入したので、購入するプロセスや手続きを載せます。 アセットの購入 最初に自分が買いたいアセットを探します。 購入するのアセットをクリックしてBuy Nowボタンをクリックします。 個人情報の入力 ボタンをクリックすると個人情報入力の画面が表示されますので順に入力していきます。 入力項目は以下です。 ・Location(国名) ・First Name (名前) ・Last Name (苗字) ・Email (Eメールアドレス) ・Company Name (会社名) ・Phone (電話番号) ・Address (住所) 支払情報を入力 次に支払方法を入力します。 クレジットカードで支払う方法とPayPalで支払う方法があります。 クレジットカードの場合は入力項目が以下です。 ・クレジット番号 ・有効期限 ・CVC番号(カードの裏に記入されている3桁の番号 ・クレジットカードに入力されている名前 Paypalの場合は入力項目は以下です。 ・PayPalに登録されているEメールアドレス 以降はPayPalのサイトにつながるのでそこで必要な項目を入力します。(今回は割愛します) 購入前の確認事項等 購入前にユーザーライセンスへの同意を確認されるのでチェックを入れます。 また、購入時にアセットについての情報や領収書をの送付を希望する場合はチェックを入れます。 チェックを入れると購入したときに登録したメールアドレス宛にメールが届きますので確認してください。 アセットのインポート 最後に購入したアセットをインポートして使えるようにします。 Unityエディタのメニュー Window>Package Managerで画面を開きます。 Importボタンをクリックします。 まとめ 有料のアセットを購入する際の入力する情報について解説しました。 購入してから使えるようにするための方法を解説しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Explore - "Unity URP Tutorial - Orthographic Fog Plane Shader"

上記の動画で使われてる技術(特に霧のshader graph)を調べていくなりよ~。 Orthographic Depth 使われてるノード一覧 Camera Lerp Scene Depth 役割 カメラからの距離を取得。 やってること "Camera"の手前のクリップ面までの距離(Near Plane)と奥側のクリップ面(Far Plane)までの距離を"Scene Depth"(カメラからオブジェクトまでの距離で0~1で表される)の値を媒介変数として、"Lerp"で線形補完をし、開始を手前の面までの距離、終了を奥の面までの距離としたものを1つ、それを逆にしたものを1つの計2つ作っている。 ※動画では調整してPlaneがScene Depthの値として使われないようになっている?のでPlaneの奥に見える最も手前のものまでの距離となっている。 Reverse Z Check 使われているノード一覧 Camera Comparison Branch 役割 Depth BufferにReversed Zを使っているか否かで距離の値が変わるのでDepth Bufferの判定をし、使う値を選択。 やってること "Camera"の"Z Buffer Sign"(Reverse Zを使っていれば-1そうでなければ1を返す)を"Comparison"を使って確認するために作成。その結果を"Branch"に接続し、もしTrueならFarPlane-NearPlane間での値をそうでなければNearPlane-FarPlane間の値を使うように条件分けをしている。 補足 nvidiaの解説より、"ただし、ここで重要な実際の結果は次のとおりです。逆Zマッピングは基本的に魔法です"らしいから深追いしない。ヤクの毛は刈ってはいけない... Calculate World Pos from Scene Depth 使われているノード一覧 Negate Position Split Vector3 Transform Subtract Object 役割 カメラからの奥行きは取得できたのでカメラ視点からのX,Yを取得しそれらをworld座標に変換、オブジェクトの座標を弾いてワールド座標で原点にあった場合の座標としている。 やってること "Position"を使い、カメラ視点でのメッシュの頂点/フラグメントの位置を取得しそれをSplitでX座標とY座標の位置のみ抽出。また"Negate"(入力値の符号を反転するだけ)を使って上記で得た値を符号反転した値をZとし、"Vector3"を作成。"Transform"を使って先のベクトルをView座標から、World座標に変換。 その後今得た値から、オブジェクト本体のworld座標のベクトルを引く。 Handle Fog(based on Normal Direction) 使われているノード一覧 Transform Normal Vector Normalize Dot Product Negate Saturate 役割 内積を使っている理由は(解説されていないのでおそらくになる)内積はベクトルAとBの絶対値の積にcosθをかけたものとなる。またBのAに対する正射影に対してAの絶対値をかけたものになるのでみている角度がPlaneに対して平行になる程、結果は小さくなるし(見る角度が浅くなる程霧が薄くなる)、また絶対値を利用していることから遠いところほど大きな結果になる(遠いところほど霧が濃くなる)この2つを目的としているから?またNegateをしているのは裏側から見た時に霧が見えないようにするためだと思われ。saturateをしているのは単にアルファが0~1なのと、特に補正をかけるとかじゃなく、ある閾値以上の結果は全て1にしても霧のエフェクトとしては十分だからか? やっていること  計算してきた値と、正規化された法線ベクトルのドット積を計算。それを0から1までの値にする。 出力部 *使われているノード一覧 * Color * Split * Multiply *役割 ここまでで近いところほどalphaが小さく、遠いところほどalphaが大きいという入力が得られたのでそれを利用してfragemntの最終調整をしているだけ。 やっていること "Color"の値を"Fragmentに接続 "Color"のalphaを"Split"で抽出し、上記の計算で得た値と掛け合わせる。そしてその結果を"Fragment"のalphaに接続。 感想 わからん。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityでカメラが近づくとモデルが消えてしまう時の対処法

カメラが近づいた際にモデルが消えてしまう現象が発生している・・・ モデルを設置する際には表示されるがなぜ近づくと消えてしまうのか。 解決方法 「Inspector」から「update whenoffscreen」にチェックマークをつける。英文の通り「オフスクリーン時に更新 見えない時もその処理を実行」キャラクターが多く出てくるプロジェクトには問題が発生してくる。 そのほかの対処法としては、「skinnedMeshRenderer」の「Bounds」の「Extent」ここを調整して大きくすれば表示される場合もある。 それでも解決されない場合 ・FileからBuild Settingを選択する ・PlatformからWebGLを選択し、Switch Platformを選択する。 結果 Unityで近づいてもモデルが消えて現象が解消されました。✨ 「Update when Offscreen」や「skinnedMeshRenderer」の「Bounds」の「Extent」を変更してもモデルが消えてしまう場合は、WebGLのみの対応なのか、どのプラットフォームに対応しているのか確認してみた方が良いのかもしれませんね〜!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

参考まとめ

https://www.cyanilux.com/ この動画で紹介されていた人のブログ。https://www.youtube.com/watch?v=1ZsKBZnbAB8 グラフィック関連
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Clusterで使えるShaderめーも

開発環境 Unity 2019.4.22f1 Cluster Creator Kit 1.13 Color Shader "Unlit/ColorUnlitShader" { Properties { _Color ("Main Color", Color) = (1,1,1,1) } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" fixed4 _Color; float4 vert (float4 vertex : POSITION) : SV_POSITION { return UnityObjectToClipPos(vertex); } fixed4 frag () : SV_Target { return _Color; } ENDCG } } } Normal Shaderのお勉強 #ShaderLab #Cluster #Unity pic.twitter.com/plR3gNeWtR— がちもとさん@メタバース熊本 (@sotongshi) November 23, 2021 Shader "Unlit/NormalUnlitShader" { Properties { } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f { half3 worldNormal : TEXCOORD0; float4 pos : SV_POSITION; }; v2f vert (float4 vertex : POSITION, float3 normal : NORMAL) { v2f o; o.pos = UnityObjectToClipPos(vertex); o.worldNormal = UnityObjectToWorldNormal(normal); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 c = 0; c.rgb = i.worldNormal*0.5 + 0.5; return c; } ENDCG } } } シマシマ しましましぇーだー!#ShaderLab #Cluster #Unity pic.twitter.com/JgPTYYJ9H0— がちもとさん@メタバース熊本 (@sotongshi) November 23, 2021 Shader "Unlit/ShimaShimaUnlitShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } void Unity_Multiply_float (float A, float B, out float Out) { Out = A * B; } void Unity_Add_float (float A, float B, out float Out) { Out = A + B; } void Unity_Fraction_float (float In, out float Out) { Out = frac(In); } void Unity_Step_float (float Edge, float In, out float Out) { Out = step(Edge, In); } fixed4 frag (v2f i) : SV_Target { float2 _UV_Out = i.uv; float _Split_R = _UV_Out[0]; float _Split_G = _UV_Out[1]; float _Multiply_Out; Unity_Multiply_float(_Split_R, 3, _Multiply_Out); float _Add_Out; Unity_Add_float(_Multiply_Out, _Time.y, _Add_Out); float _Fraction_Out; Unity_Fraction_float(_Add_Out, _Fraction_Out); float _Step_Out; Unity_Step_float(_Fraction_Out, 0.5, _Step_Out); return _Step_Out; } ENDCG } } } 実験 参考 Amplify Shader EditorならClusterで動く??ShaderGraph?ShaderForgeワールドに多彩な表現をもたらす「シェーダー」の紹介【Amplify Shader Editor編】 https://t.co/eMApE6FuzL @cluster_jpより #Cluster #Unity— がちもとさん@メタバース熊本 (@sotongshi) November 24, 2021 【検証】clusterで動くシェーダーを求めて|カティア #note https://t.co/UXPWZyOEto #Cluster #Unity— がちもとさん@メタバース熊本 (@sotongshi) November 24, 2021 ShaderGraphのノードと生成されるサンプルコードが書いてあるhttps://t.co/G7ktp26h1C#Unity #ShaderGraph— がちもとさん@メタバース熊本 (@sotongshi) November 24, 2021
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む