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

[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.alibUnityARKit.aにリネームされたようです。
古いファイルを参照しているので、一度プロジェクト>Libraryを削除し、再度ビルドすると今度はビルドが通りました。

参考文献

https://docs.unity3d.com/Packages/com.unity.xr.arkit@4.0/changelog/CHANGELOG.html

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityでVSCodeを使用中、関数ジャンプや参照ができない!の解決方法

この記事について

Unityを使ってる際、スクリプトを書くために用いてたVSCodeがNo definition found forNo reference found forとなってしまっていたので、解決した際の手順を記録。

本記事で使用している環境

  • Microsoft Windows
    Version 1903 (OS Build 18362,900)
    Windows 10

  • Visual Studio Code
    Version: 1.46.1

手順

  1. Unityのプロジェクトで使ってるフォルダ内の、Assembly-CSharpと名がついてる拡張子がcsprojのファイルを削除。
    Assembly-CSharp.csproj
    Assembly-CSharp-Editor.csproj
    Assembly-CSharp-firstpass.csproj

  2. Unityのプロジェクトを開き、Edit > Preferencesを選択。
    External ToolsExternal Script EditorがVisual Studio Codeになっているのを確認。(他のエディターになっている場合は変更する。)

  3. UnityのAssets > Open C# Projectを実行。

  4. Unityのプロジェクトで使ってるフォルダ内で、1.で消したAssembly-CSharpフォルダが新しく生成されているのを確認する。

以上です。
これでVSCodeの関数ジャンプや参照が使えるようになりました。

最後に

今回はこのように解決しましたが、似たような問題の原因と解決方法が同じだとは限らないので、一例として捉えてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】ノンコーディングでオブジェクトを動かしたい【Animation】

前説

当記事の動画解説はこちらから

【unity】Animationを使って、ノンコーディングでオブジェクトを動かしてみよう

サムネ用.png

さて、
【Unity】いったりきたりするオブジェクトをつくるのように、
わざわざスクリプトに書かなくても、
Cubeの移動などはAnimationクリップでかんたんに移動させることができます。
また、Animationクリップを作成することによって、
自動的にアニメーターコントローラーなどアタッチされるため、
ぜひ有効活用していきたいコンポーネントのひとつです。

下図は、今回の作例です。
スクリーンショット 2020-07-06 10.04.27のコピー.png

応用すればこうなる

応用すれば、要スクリプト必須ですが、
動いている横方向のオブジェクトに、プレイヤーを載せることもできます。
(今回の記事では解説しません)
スクリーンショット 2020-07-06 11.54.57.png
下記動画は、その様子です。(解説動画ではありません)

動く床に擬似プレイヤーを載せてみた


参考元

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]を選択する。
スクリーンショット 2020-07-06 9.56.29.png

下図のように、Animationウィンドウが表示されるので、わかりやすい場所にドッキングする。
ドッキングの仕方がわからない場合は、【unity】ウィンドウタブの動かし方を参照。
スクリーンショット 2020-07-06 9.57.07.png

動かしたいオブジェクトを選択する。
今回は、「MoveCube」という名前で、Cubeを動かす。
スクリーンショット 2020-07-06 9.57.00.png

Animationウィンドウで、[Create]ボタンを押下する。
スクリーンショット 2020-07-06 9.57.07のコピー.png

下図のウィンドウで、アニメーションクリップ名を決める。
(この名前で、アニメーターコントローラーのアセットも作成される)
スクリーンショット 2020-07-06 9.57.32.png

今回は、オブジェクトと同じ名前で、「MoveCube」という名前にした。
スクリーンショット 2020-07-06 9.58.02.png

Animationウィンドウも、下図のように変わる。
スクリーンショット 2020-07-06 9.59.09.png

なお、下図のようにアニメーターコントローラーも、アセット内に作成されるが、今回は使用しない。
スクリーンショット 2020-07-06 9.59.28.png

以上が、オブジェクトをアニメーションさせるための準備となる。
次からは、実際にオブジェクトを動かしてみよう。


実践編

今回は、

  • 1秒で目的の場所へ「MoveCube」が移動して
  • 1秒で元の場所へ戻る

アニメーションを作っていく。

まずは、下図の枠内に「60」と入力する。
(ミリ秒なので、60ミリ秒 = 1秒 という意味)
スクリーンショット 2020-07-06 10.02.43.png

下図のレコードボタンを押下する。
(レコードボタンを押下することによって、その時間のオブジェクトの位置などを記録(レコード)することができる)
スクリーンショット 2020-07-06 10.02.51.png

移動させたい場所へオブジェクト(今回は「MoveCube」)を移動させたり、TransformコンポーネントのPositionの値を変更する。
(下図は、編集の都合でヒエラルキーウィンドウやインスペクターウィンドウの配置がデフォルトと異なるので、混乱しないように注意)
スクリーンショット 2020-07-06 10.03.19.png

変更できたら、下図のように、Animationウィンドウのレコードボタンを忘れずに押下する。
押下前
スクリーンショット 2020-07-06 10.03.34.png
↓ このように、赤い表示がなくなる。
スクリーンショット 2020-07-06 10.03.42.png

レコードボタンの押し忘れには注意すること。

再生ボタンを押下すると、オブジェクトの動きを確認することができる。
スクリーンショット 2020-07-06 10.04.27のコピー.png

同様に、
「120ミリ秒(2秒)後に、元の場所へ戻る」ようにしたい。
あえてスクショには枠などを設けていないので、上のページを見ながらチャレンジしてほしい。

「120」を入力する。
スクリーンショット 2020-07-06 10.05.10.png

レコードボタンを押下する。
スクリーンショット 2020-07-06 10.05.26.png

オブジェクトを、元の場所へ戻るよう、Positionの値を変更する。
(下図の例では、x,y,zともに0,0,0とした)
スクリーンショット 2020-07-06 10.05.42.png

レコードボタンを押下して、レコード状態を解除する。
スクリーンショット 2020-07-06 10.05.10.png

再生ボタンを押下して、オブジェクト(今回なら「MoveCube」)がいったりきたりすれば成功。


おまけ編

オブジェクトのpositionだけでなく、rotationやscaleも変更することができる。
Animationウィンドウの[AddProperty]を押下すると、各項目が表示される。

スクリーンショット 2020-07-06 10.06.28.png
スクリーンショット 2020-07-06 10.06.36.png

下図は、RotationとScaleをそれぞれ追加したもの。
スクリーンショット 2020-07-06 10.06.56.png

時間を指定して、レコードボタンを押下して設定すれば、位置だけでなく、
回転やサイズも変更することができる。
ぜひチャレンジしてみよう。
スクリーンショット 2020-07-06 10.07.57.png


  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【C#】コムソートとは(コード付き)

コムソートとは

コムソートはバブルソートの改良版です。
安定ソートではないため場合によっては処理が多くなってしまいますが基本的には早いです。

アルゴリズム

  1. 総数 n を 1.3 で割り、小数点以下を切り捨てた数を間隔 h とする。 i=0 とする。
  2. i 番目と i+h 番目を比べ、i+h 番目が小さい場合入れ替える。
  3. i=i+1 とし、i+h>n となるまで3を繰り返す。
  4. hがすでに1になっている場合は入れ替えが発生しなくなるまで上の操作を繰り返す。
  5. h を 1.3 で割り、小数点以下を切り捨てた数を新たに間隔 h とし、操作を繰り返す。

実行結果

コムソート.gif

サンプルコード

    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;
    }

まとめ

交換ソートの中では比較的に早いですが安定はしていませんのでたまにソートが遅くなります。
交換ソートの中では比較的に早いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity/C#】コムソートとは(コード付き)

コムソートとは

コムソートはバブルソートの改良版です。
安定ソートではないため場合によっては処理が多くなってしまいますが基本的には早いです。

アルゴリズム

  1. 総数 n を 1.3 で割り、小数点以下を切り捨てた数を間隔 h とする。 i=0 とする。
  2. i 番目と i+h 番目を比べ、i+h 番目が小さい場合入れ替える。
  3. i=i+1 とし、i+h>n となるまで3を繰り返す。
  4. hがすでに1になっている場合は入れ替えが発生しなくなるまで上の操作を繰り返す。
  5. h を 1.3 で割り、小数点以下を切り捨てた数を新たに間隔 h とし、操作を繰り返す。

実行結果

コムソート.gif

サンプルコード

    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;
    }

まとめ

交換ソートの中では比較的に早いですが安定はしていませんのでたまにソートが遅くなります。
交換ソートの中では比較的に早いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む