- 投稿日:2020-07-06T23:31:50+09:00
[Unity/ARFoundation]Apple Mach-O Linker (ld) Error clang: error: no such file or directory com.unity.xr.arkit/Runtime/iOS/UnityARkit.aの対処方法
はじめに
ARFoundationを2.xから4.02へアップデートしたタイミングで、iOSビルド時に次のエラーが発生しました。
Apple Mach-O Linker (ld) Error clang: error: no such file or directory (中略) com.unity.xr.arkit/Runtime/iOS/UnityARkit.a対処方法
ARKit XR Plugin更新履歴によると、
4.0.0-preview.1
で破壊的変更として、UnityARkit.a
はlibUnityARKit.a
にリネームされたようです。
古いファイルを参照しているので、一度プロジェクト>Library
を削除し、再度ビルドすると今度はビルドが通りました。参考文献
https://docs.unity3d.com/Packages/com.unity.xr.arkit@4.0/changelog/CHANGELOG.html
- 投稿日:2020-07-06T13:29:23+09:00
UnityでVSCodeを使用中、関数ジャンプや参照ができない!の解決方法
この記事について
Unityを使ってる際、スクリプトを書くために用いてたVSCodeが
No definition found for
やNo reference found for
となってしまっていたので、解決した際の手順を記録。本記事で使用している環境
Microsoft Windows
Version 1903 (OS Build 18362,900)
Windows 10Visual Studio Code
Version: 1.46.1手順
Unityのプロジェクトで使ってるフォルダ内の、Assembly-CSharpと名がついてる拡張子がcsprojのファイルを削除。
Assembly-CSharp.csproj
Assembly-CSharp-Editor.csproj
Assembly-CSharp-firstpass.csproj
Unityのプロジェクトを開き、
Edit
>Preferences
を選択。
External Tools
のExternal Script Editor
がVisual Studio Codeになっているのを確認。(他のエディターになっている場合は変更する。)
Unityの
Assets
>Open C# Project
を実行。
Unityのプロジェクトで使ってるフォルダ内で、1.で消したAssembly-CSharpフォルダが新しく生成されているのを確認する。
以上です。
これでVSCodeの関数ジャンプや参照が使えるようになりました。最後に
今回はこのように解決しましたが、似たような問題の原因と解決方法が同じだとは限らないので、一例として捉えてください。
- 投稿日:2020-07-06T11:47:06+09:00
【Unity】ノンコーディングでオブジェクトを動かしたい【Animation】
前説
当記事の動画解説はこちらから
【unity】Animationを使って、ノンコーディングでオブジェクトを動かしてみよう
さて、
【Unity】いったりきたりするオブジェクトをつくるのように、
わざわざスクリプトに書かなくても、
Cubeの移動などはAnimationクリップでかんたんに移動させることができます。
また、Animationクリップを作成することによって、
自動的にアニメーターコントローラーなどアタッチされるため、
ぜひ有効活用していきたいコンポーネントのひとつです。応用すればこうなる
応用すれば、要スクリプト必須ですが、
動いている横方向のオブジェクトに、プレイヤーを載せることもできます。
(今回の記事では解説しません)
下記動画は、その様子です。(解説動画ではありません)動く床に擬似プレイヤーを載せてみた
参考元
Unityユーザーマニュアル
Animationウィンドウの利用法
https://docs.unity3d.com/ja/2018.4/Manual/animeditor-UsingAnimationEditor.html
ゲームオブジェクトのアニメーション化
https://docs.unity3d.com/ja/2018.4/Manual/animeditor-AnimatingAGameObject.html
準備編
[Window]メニューから、[Animation]を選択して、さらに[Animation]を選択する。
下図のように、Animationウィンドウが表示されるので、わかりやすい場所にドッキングする。
ドッキングの仕方がわからない場合は、【unity】ウィンドウタブの動かし方を参照。
動かしたいオブジェクトを選択する。
今回は、「MoveCube」という名前で、Cubeを動かす。
Animationウィンドウで、[Create]ボタンを押下する。
下図のウィンドウで、アニメーションクリップ名を決める。
(この名前で、アニメーターコントローラーのアセットも作成される)
今回は、オブジェクトと同じ名前で、「MoveCube」という名前にした。
なお、下図のようにアニメーターコントローラーも、アセット内に作成されるが、今回は使用しない。
以上が、オブジェクトをアニメーションさせるための準備となる。
次からは、実際にオブジェクトを動かしてみよう。
実践編
今回は、
- 1秒で目的の場所へ「MoveCube」が移動して
- 1秒で元の場所へ戻る
アニメーションを作っていく。
まずは、下図の枠内に「60」と入力する。
(ミリ秒なので、60ミリ秒 = 1秒 という意味)
下図のレコードボタンを押下する。
(レコードボタンを押下することによって、その時間のオブジェクトの位置などを記録(レコード)することができる)
移動させたい場所へオブジェクト(今回は「MoveCube」)を移動させたり、TransformコンポーネントのPositionの値を変更する。
(下図は、編集の都合でヒエラルキーウィンドウやインスペクターウィンドウの配置がデフォルトと異なるので、混乱しないように注意)
変更できたら、下図のように、Animationウィンドウのレコードボタンを忘れずに押下する。
押下前
↓ このように、赤い表示がなくなる。
レコードボタンの押し忘れには注意すること。
再生ボタンを押下すると、オブジェクトの動きを確認することができる。
同様に、
「120ミリ秒(2秒)後に、元の場所へ戻る」ようにしたい。
あえてスクショには枠などを設けていないので、上のページを見ながらチャレンジしてほしい。オブジェクトを、元の場所へ戻るよう、Positionの値を変更する。
(下図の例では、x,y,zともに0,0,0とした)
再生ボタンを押下して、オブジェクト(今回なら「MoveCube」)がいったりきたりすれば成功。
おまけ編
オブジェクトのpositionだけでなく、rotationやscaleも変更することができる。
Animationウィンドウの[AddProperty]を押下すると、各項目が表示される。下図は、RotationとScaleをそれぞれ追加したもの。
時間を指定して、レコードボタンを押下して設定すれば、位置だけでなく、
回転やサイズも変更することができる。
ぜひチャレンジしてみよう。
- 投稿日:2020-07-06T09:44:47+09:00
【C#】コムソートとは(コード付き)
コムソートとは
コムソートはバブルソートの改良版です。
安定ソートではないため場合によっては処理が多くなってしまいますが基本的には早いです。アルゴリズム
- 総数 n を 1.3 で割り、小数点以下を切り捨てた数を間隔 h とする。 i=0 とする。
- i 番目と i+h 番目を比べ、i+h 番目が小さい場合入れ替える。
- i=i+1 とし、i+h>n となるまで3を繰り返す。
- hがすでに1になっている場合は入れ替えが発生しなくなるまで上の操作を繰り返す。
- h を 1.3 で割り、小数点以下を切り捨てた数を新たに間隔 h とし、操作を繰り返す。
実行結果
サンプルコード
int[] ComdSort(int[] _array) { // 交換したかのチェックフラグ bool isChanged = false; // 櫛の間隔を定義します。 int h = _array.Length; // コムソートで配列の中身を昇順で並べ替えます。 while (isChanged || h > 1) { // 櫛の間隔を計算します。 if (h > 1) { h = Mathf.FloorToInt(h / 1.3f); } isChanged = false; for (int i = 0; i < _array.Length - h; i++) { // 指定した間隔の要素と比較し、順序が逆であれば入れ替えます。 if (_array[i] > _array[i + h]) { // 配列の要素の交換を行います。 int temp = _array[i]; _array[i] = _array[i + h]; _array[i + h] = temp; // 交換フラグをtrueにします。 isChanged = true; } } } return _array; }まとめ
交換ソートの中では比較的に早いですが安定はしていませんのでたまにソートが遅くなります。
交換ソートの中では比較的に早いです。
- 投稿日:2020-07-06T09:44:47+09:00
【Unity/C#】コムソートとは(コード付き)
コムソートとは
コムソートはバブルソートの改良版です。
安定ソートではないため場合によっては処理が多くなってしまいますが基本的には早いです。アルゴリズム
- 総数 n を 1.3 で割り、小数点以下を切り捨てた数を間隔 h とする。 i=0 とする。
- i 番目と i+h 番目を比べ、i+h 番目が小さい場合入れ替える。
- i=i+1 とし、i+h>n となるまで3を繰り返す。
- hがすでに1になっている場合は入れ替えが発生しなくなるまで上の操作を繰り返す。
- h を 1.3 で割り、小数点以下を切り捨てた数を新たに間隔 h とし、操作を繰り返す。
実行結果
サンプルコード
int[] ComdSort(int[] _array) { // 交換したかのチェックフラグ bool isChanged = false; // 櫛の間隔を定義します。 int h = _array.Length; // コムソートで配列の中身を昇順で並べ替えます。 while (isChanged || h > 1) { // 櫛の間隔を計算します。 if (h > 1) { h = Mathf.FloorToInt(h / 1.3f); } isChanged = false; for (int i = 0; i < _array.Length - h; i++) { // 指定した間隔の要素と比較し、順序が逆であれば入れ替えます。 if (_array[i] > _array[i + h]) { // 配列の要素の交換を行います。 int temp = _array[i]; _array[i] = _array[i + h]; _array[i + h] = temp; // 交換フラグをtrueにします。 isChanged = true; } } } return _array; }まとめ
交換ソートの中では比較的に早いですが安定はしていませんのでたまにソートが遅くなります。
交換ソートの中では比較的に早いです。
- 投稿日:2020-07-06T03:30:50+09:00
Unity サブステートマシン内のステートをスクリプトから操作する
やりたいこと
AnimatorControllerのBase Layerに作ったAttackサブステートマシン内の全てのステートのmirrorをスクリプトから操作したい
スクリプト
using System.Collections; using System.Collections.Generic; using UnityEditor.Animations; using UnityEngine; private List<AnimatorState> attackStates = new List<AnimatorState>(); void Start() { Animator _animator = GetComponent<Animator>(); AnimatorController _animCon = _animator.runtimeAnimatorController as AnimatorController; AnimatorControllerLayer[] layers = _animCon.layers; foreach (AnimatorControllerLayer layer in layers) { if (layer.stateMachine.name == "Base Layer") //layer指定 { ChildAnimatorStateMachine[] _animStateMachines = layer.stateMachine.stateMachines; foreach (ChildAnimatorStateMachine statemachine in _animStateMachines) { if (statemachine.stateMachine.name == "Attack") //sub-state machine指定 { foreach (ChildAnimatorState state in statemachine.stateMachine.states) { attackStates.Add(state.state); } } } } } } public void switchMirror() { foreach (AnimatorState state in attackStates) { state.mirror = !state.mirror; //mirrorを操作 _animator.Rebind(); //リバインド忘れずに } }参考リンク
https://gametukurikata.com/animationanimator/statefootik
https://docs.unity3d.com/ja/current/ScriptReference/Animations.AnimatorStateMachine.html