20210605のUnityに関する記事は6件です。

いつもぶつかって何となく調べて解決してきたAndroid周りの対応 その2

前置き いつも同じようなエラーが発生する(気がする)…… 多分Unityのversion upしたタイミングな気がしている…… でもその度調べて解決してるが、結局いつも原因忘れてしまっている…… 以前書いた、「いつもぶつかって何となく調べて解決してきたAndroid周りの対応」とはまた別の事象 以前の件はAdMobに関係するところ 今回はUnityでのAndroidビルド時に発生 環境 Unity2020.3.9f1 事象 UnityでのAndroidビルド時に下記のエラーが発生。 Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 FAILURE: Build failed with an exception. * Where: Build file '/Users/xxx/git/InfiniteStrawberry/Temp/gradleOut/launcher/build.gradle' line: 3 * What went wrong: A problem occurred evaluating project ':launcher'. > Failed to apply plugin [id 'com.android.internal.version-check'] > Minimum supported Gradle version is 5.6.4. Current version is 5.1.1. If using the gradle wrapper, try editing the distributionUrl in /Users/nir/git/InfiniteStrawberry/Temp/gradleOut/launcher/gradle/wrapper/gradle-wrapper.properties to gradle-5.6.4-all.zip * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 1s UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&) (at /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUIUtility.cs:189) 結論 gradleのpath(Preference > External Tools)の指定が誤っていた 解決方法 Preference > External Toolsのgradle部分をチェックする形にした 前のUnityのversionの時には逆に指定しないと通らなくて、直接指定してた ただ、その設定を今回引き継いだら今回のversionだとNGだった…… 前versionだと直接UnityをDL&installしていたが、今versionはUnityHub経由でinstallして、Android関連のモジュールもUnityHubで追加できている状態なので、ずっとUnityHubで管理している人は多分同事象は発生しない? その他 調べていく上で、同じようなエラーが発生した場合、プロジェクトのパスにASCII文字以外(日本語とか)が含まれると発生するケースもあるらしい UnityのAndroidビルドでGradleエラー 参考資料 Can't compile Unity Project with ARCore SDK - Problem with Gradle
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

unity canvas画面サイズの備忘録

画面サイズを自動的に調整する簡単な方法(rawimageのサイズ固定) canvasを配置。その中にrawimageを配置。サイズは調整に用いる画面サイズにしておく。 gameタブの画面サイズを合わせる。その状態でほかの接地するUIを配置。Canvas ScalerでUI Screen ModeをScale With Screen Sizeに変更。ここで先ほどのサイズを指定。Match ModeはExpandeにしておく。これで最初に最初に決めたUIの配置をまもるように画面サイズに対応してくれる。 しかしrawimageのサイズを画面サイズに対して変更する場合には配置を保持するあまりおかしくなるので要対応
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】shaderでクォータニオンを使った回転を行う

はじめに shaderでクォータニオンを使った回転をします。クォータニオンを数学的に理解するのは難しいですが、使うだけなら簡単です。 本記事ではクォータニオンについての解説は行いません。少し調べるだけでとてもわかりやすい解説がたくさん見つかるからです。 クォータニオンについて知りたい方は以下の記事を読むことをおすすめします。 CGのための数学 09 クォータニオン https://zenn.dev/mebiusbox/books/132b654aa02124/viewer/2966c7 今回の記事で使ったサンプルをGithubにアップしました。 shaderでクォータニオンを使う クォータニオンは軸と角度を決めて回転を行うのでジンバルロックが発生しなかったり、最適化次第で他の回転手法より処理が軽かったりします。 回転 float4 quaternion(float rad, float3 axis) { return float4(normalize(axis) * sin(rad * 0.5), cos(rad * 0.5)); } float3 rotateQuaternion(float rad, float3 axis, float3 pos) { float4 q = quaternion(rad, axis); return (q.w*q.w - dot(q.xyz, q.xyz)) * pos + 2.0 * q.xyz * dot(q.xyz, pos) + 2 * q.w * cross(q.xyz, pos); } v2f vert (appdata v) { v2f o; v.vertex.xyz = rotateQuaternion(_Rad, _Axis, v.vertex.xyz); o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } _Rad = _Time.y , _Axis = (1.0, 0, 0) の時の動作 X軸で回転してますね クォータニオンの合成 float4 quaternion(float rad, float3 axis) { return float4(normalize(axis) * sin(rad * 0.5), cos(rad * 0.5)); } float4 mulQuaternion(float4 q, float4 r) { return float4( q.w*r.xyz + r.w*q.xyz + cross(q.xyz, r.xyz), q.w*r.w - dot(q.xyz,r.xyz)); } float3 rotateQuaternion(float rad, float3 axis, float3 pos) { float4 q = quaternion(rad, axis); return (q.w*q.w - dot(q.xyz, q.xyz)) * pos + 2.0 * q.xyz * dot(q.xyz, pos) + 2 * q.w * cross(q.xyz, pos); } v2f vert (appdata v) { v2f o; float4 q1 = quaternion(_Rad1, _Axis1); float4 q2 = quaternion(_Rad2, _Axis2); float4 q = mulQuaternion(q1, q2); v.vertex.xyz = rotateQuaternion(q, v.vertex.xyz); o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } _Axis1(1.0, 0, 0) _Rad1(0.785) , _Axis2(0, 1.0, 0) _Rad2(0.785) の時の動作 X軸で45度、Y軸で45度のクォータニオンが合成されています クォータニオンの球面線形補間 float4 quaternion(float rad, float3 axis) { return float4(normalize(axis) * sin(rad * 0.5), cos(rad * 0.5)); } float4 sLerpQuaternion(float4 q, float4 r, float t) { float qr = dot(q,r); float hs = 1.0 - qr *qr; if(hs <= 0.0){ return q; } else{ hs = sqrt(hs); if(abs(hs) < 0.0001){ return q*0.5 + r*0.5; }else{ float theta = acos(qr); return sin((1.0 - t)*theta)*q/sin(theta) + r*sin(t*theta)/sin(theta); } } return float4(0,0,0,1); } float3 rotateQuaternion(float rad, float3 axis, float3 pos) { float4 q = quaternion(rad, axis); return (q.w*q.w - dot(q.xyz, q.xyz)) * pos + 2.0 * q.xyz * dot(q.xyz, pos) + 2 * q.w * cross(q.xyz, pos); } v2f vert (appdata v) { v2f o; float4 q1 = quaternion(_Rad1, _Axis1); float4 q2 = quaternion(_Rad2, _Axis2); float4 q = sLerpQuaternion(q1, q2, _SlerpPer); v.vertex.xyz = rotateQuaternion(q, v.vertex.xyz); o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } lerp関数のように第三引数に0から1までの値を使うことで補間ができます if文が多いので少し処理負荷が高いです _Axis1(1.0, 0, 0) _Rad1(0.785) , _Axis2(0, 1.0, 0) _Rad2(0.785) , _SlerpPer(frac(_Time.y)) の時の動作 X軸で45度回転したときの姿勢とY軸で45度回転したときの姿勢の間を補完しています オイラー角からクォータニオンへの変換 #define PI acos(-1.0) float3 angleToRadian(float3 angle) { return PI*angle/180.0; } // Unityの回転順はZXY float4 eulerToQuaternion(float3 rad) { rad.x += PI;//Unityの座標系にあわせる rad = rad*0.5; rad.xy = -rad.yx;//Unityの座標系にあわせる return float4(cos(rad.z)*cos(rad.x)*cos(rad.y) + sin(rad.z)*sin(rad.x)*sin(rad.y), sin(rad.z)*cos(rad.x)*cos(rad.y) - cos(rad.z)*sin(rad.x)*sin(rad.y), cos(rad.z)*sin(rad.x)*cos(rad.y) + sin(rad.z)*cos(rad.x)*sin(rad.y), cos(rad.z)*cos(rad.x)*sin(rad.y) - sin(rad.z)*sin(rad.x)*cos(rad.y)); } float3 rotateQuaternion(float4 q, float3 pos) { return (q.w*q.w - dot(q.xyz, q.xyz)) * pos + 2.0 * q.xyz * dot(q.xyz, pos) + 2 * q.w * cross(q.xyz, pos); } v2f vert (appdata v) { v2f o; float4 q = eulerToQuaternion(angleToRadian(_Rotation.xyz)); v.vertex.xyz = rotateQuaternion(q, v.vertex.xyz); o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } オイラー角からクォータニオンに変換しているのでジンバルロックに注意する必要があります。 Unityの回転順はZXYなのでshader側でもZXYの順で回転するようにしています。 _Rotation(45, 45, 45) の時の動作 おまけ クォータニオンからオイラー角への変換 // クォータニオンをオイラー角(ラジアン)に変換する float3 quaternionToEuler(float4 q) { return float3(atan2(2.0*(q.w*q.x + q.y*q.z), 1.0 - 2.0*(q.x*q.x + q.y*q.y)), asin(2.0*(q.w*q.y - q.z*q.x)), atan2(2.0*(q.w*q.z + q.x*q.y), 1.0 - 2.0*(q.y*q.y + q.z*q.z))); } 需要皆無 参考文献 CGのための数学 09 クォータニオン https://zenn.dev/mebiusbox/books/132b654aa02124/viewer/2966c7 Conversion between quaternions and Euler angles https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

NGUI要素と普通のColliderが被った場合マウスイベントはどっちで発火するか

超概要 普通のcolliderとNGUIで作ったボタン要素が被った場合、 マウスイベントはどっちで発火するか調べた 結果:普通のcolliderとNGUIの両方で発火する 環境 Unity 2018.4.31f1 NGUI: Next-Gen UI 2018.3.0f 経緯 やりたいこと 既存プロジェクトのマウスイベントをマウスもタッチパネルも使えない環境に対応することになった プログラムでマウスイベントを呼びたいがNGUIとUnityのマウスイベントがわからなかったので調べた hierarchyに普通のカメラと普通のコライダーも混ざった場合、 クリック判定はどうなるのか? 実験 ↓↓サンプルScene↓↓ 結果 どっちも当たる 上の画像ならbuttonの判定と後ろのCubeの判定の両方が来る ※OnMouseイベントでテスト NGUIはUnityのクリック判定を無視して独自に処理するらしい なので NGUIのUICameraを書き換えてプログラムからマウスイベントを呼べるように修正し、 UICamera以外のカメラからもRaycastしてマウスイベントを無理やりコールすることで解決 追記(2021/06/05) uGUIでも同様の結果になりました 全部重なったところを押すと ・uGUIで一番上の要素 ・uGUI以外で一番上の要素 のマウスイベントが呼ばれるのでなんじゃこれ感ありますね
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity(C#)】ネットワーク接続の状態に応じて処理を行う

はじめに OculusQuestでアプリがオフラインかオンラインかに応じた処理が必要になったので調べました。 Application.internetReachability 結論、Application.internetReachabilityを使えばOKです。 状態に応じてEnumを返します。 Enum 状態 NotReachable インターネットに接続していない ReachableViaCarrierDataNetwork キャリアネットワークで接続している ReachableViaLocalAreaNetwork Wi-Fiでネットワークに接続している 【参考リンク】:Unityで作成したアプリにおいて、ネットワーク接続を確認する場合に使う「Application.internetReachability」! バージョン情報 UniRx 7.1.0 Unity 2019.4.8f1 コード ネットーワークの状態に応じてテキストを変更する簡易サンプルです。 ReactivePropertyで状態が変わった時だけ処理するようにしています。 using UniRx; using UnityEngine; using UnityEngine.UI; /// <summary> /// インターネット接続をチェックするサンプル /// </summary> public class NetworkConditionChecker : MonoBehaviour { [SerializeField] private Text networkConditionText; private readonly ReactiveProperty<NetworkReachability> _networkReachReactiveProperty = new ReactiveProperty<NetworkReachability>(); private void Start() { _networkReachReactiveProperty .SkipLatestValueOnSubscribe() .Subscribe(condition => { if (condition == NetworkReachability.NotReachable) { networkConditionText.text = "接続無し"; } else { networkConditionText.text = "接続有り"; } }) .AddTo(this); } private void Update() { _networkReachReactiveProperty.Value = Application.internetReachability; } } デモ 画面下の接続の状態に応じてテキストが変更されました。成功です。 エディター上でも実機上でも変わりなく動作してくれてありがたいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GraphViewでTextureNodeを作る方法

GraphViewを勉強中です。 を一通り試した後で、では「テクスチャを持ったTextureNodeを作ろうとした時にどうしようかな?」と色々試行錯誤した結果、とりあえず実装出来たのでメモしておきます TextureNode.cs using UnityEditor.Experimental.GraphView; using UnityEditor.UIElements; using UnityEngine; using UnityEngine.UIElements; namespace ScreenPocket { /// <summary> /// テクスチャノード /// </summary> public sealed class TextureNode : NodeBase { private Image _image; public Texture texture => _image.image; public TextureNode() : base() { title = "Texture"; var outputPort = Port.Create<Edge>(Orientation.Horizontal, Direction.Output, Port.Capacity.Multi, typeof(Texture2D)); outputContainer.Add(outputPort); var objectField = new ObjectField { objectType = typeof(Texture2D), allowSceneObjects = false }; _image = new Image(); //表示用 objectField.RegisterCallback<ChangeEvent<Object>>(e => { _image.image = (Texture2D)e.newValue; }); mainContainer.Add(objectField); mainContainer.Add(_image); } } } ポイントはRegisterCallbackでしょうか。 テクスチャを扱うObjectFieldが欲しかった事もあり objectField.RegisterCallback<ChangeEvent<Texture2D>>(e => { _image.image = e.newValue; }); としようとした所、コールバックが呼ばれず、 objectField.RegisterCallback<ChangeEvent<Object>>(e => { _image.image = (Texture2D)e.newValue; }); こうしなければならなかった点で少し時間を食いました。 ちなみにこの状態だと、テクスチャが原寸大に表示されてしまい、1024x1024だと大きすぎるので objectField.RegisterCallback<ChangeEvent<Object>>(e => { _image.image = (Texture2D)e.newValue; _image.sourceRect = new Rect(0f,0f,100f,100f); }); として100x100で縮小表示しようとしましたが、どうにも上手く縮小できないので調査中です。 いっそプレビューはノードから外した方が良いかも??
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む