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

東京オリンピックのエンブレムを遊びつくす!(1)〜僕が何を作ったか〜

はじめに

 大学の授業でオリンピックのエンブレムを応用して何か作品を作ってみるという機会を頂けたので、その記録を何回かに分けて書いていきたいと思います。幾何学の話をしたり、grasshopperの話をしたり、unityの話をしたりと内容が大きく変わりますが、興味のあるところだけでも読んでくれると嬉しいです!
 また、unityとかgrasshopperとか興味あるけど、どんな風に作品に使えるかわからないという方も読んでいただけると嬉しいです!

 とまあ説明はこの辺りにして、まずは僕がどのような物を作ったのか紹介したいと思います。

完成品

僕が作ったのはオリンピックのエンブレムを作った幾何学を利用した映像作品です。
日出ずる国ということで日の出を表現しました。
movie1.gif

これからの展望

大まかに分けて以下のような構成でブログを書いていくつもりです。
1.僕が何を作ったか
2.エンブレムに隠された法則
3.ひし形充填の基本
4.grasshopperでひし形充填をする
5.左右対称にひし形を充填する
6.unityでひし形充填をする
7.日の出を作る

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

Unity(Vuforia)でAndroid向けの簡単なAR表示アプリを作る方法

はじめに

UnityでAndroid向けの簡単なAR表示アプリを作ります。
今回はマーカー画像を読み取って3Dモデルを表示できるようにします。
Unityのバージョンによってやり方が異なるようなので、本記事を参考にする際は下記の環境を参照してください。
また、本記事ではUnityが既にインストールされており、プロジェクト作成をできる状態を想定しています。

環境

  • Windows10
  • Unity 2019.2.18f1
  • Android SDK & NDK Tools
  • Vuforia Endine AR 8.5.9 (ARコンテンツを作成するためのライブラリ)
  • Android 9.0

必要な物

  • Unity (バージョンは上記の通り)
  • Android端末 (Androidの開発者モード設定などを済ませておく)
  • マーカーにする画像

準備

Vuforia Engine ARというライブラリからDevelopment Keyを取得しておきます。

アカウントの作成

こちらからアカウントを作成します。

Development Keyの取得

DevelopのLicense ManagerというタブからGet Development Keyをクリックします。
Qiita1-1.jpg

License名を入力して、ボックスにチェックを入れた後、ConfirmしてDevelopment Keyを作成します。
Qiita1-2.jpg

上手くいくと作成したKeyが表示されるので、クリックします。
Qiita1-3.jpg

(画像では隠していますが)
License Keyが表示されているので、クリックしてコピーしておきましょう。
後ほどUnity上で使用します。(A)
Qiita1-4.jpg

Databaseの取得

DevelopのTarget ManagerというタブからAdd Databaseをクリックします。
Qiita1-5.jpg

ポップアップ画面にDatabase名を入力して、CreateでDatabaseを作成します。
Qiita1-6.jpg

作成したDatabaseをクリックします。
Qiita1-7.jpg

Add Targetをクリックします。
Qiita1-8.jpg

マーカーに使用する画像ファイルを選択して、Width(100で大丈夫)とNameを入力してAddをクリックします。
Qiita1-9.jpg

作成したTargetを選択して、Download Databaseをクリックします。
Qiita1-10.jpg

ポップアップ画面上で、Unity Editorにチェックを入れてダウンロードします。
Qiita1-11.jpg

ダウンロードしたUnity package fileは後ほど使用します。(B)

ARアプリの作成

UnityでARを実装していきます。

UnityにAndroid SDK & NDK Toolsを追加

Unity HubからUnity 2019.2.18f1にモジュールを追加します。
Qiita1-12.jpg

Android Build SupportAndroid SDK & NDK Toolsにチェックを入れて、実行します。
Qiita1-13.jpg

これでAndroid SDK & NDK Toolsが追加されました。

Unityでプロジェクトを作成、設定

Unity 2019.2.18f1で3Dを選択し、プロジェクト名を入力してプロジェクトを作成します。
Qiita1-14.jpg

まずは、Vuforia Engine ARをインストールします。
Window > Package Managerをクリックします。
Qiita1-15.jpg

Vuforia Engine ARを開いて、Installします。
Qiita1-16.jpg

HierarchyウィンドウからMain Cameraを削除します。

続いて、下記の2つのGameObjectを追加します。

  • GameObject > Vuforia > AR Camera
  • GameObject > Vuforia > Camera Image > Camera Image Target

Qiita1-17.jpg

表示したい3Dオブジェクトを作成します。
ここでは、GameObject > 3D Object > Sphereを作成し、ImageTargetに対してドラック&ドロップすることで子オブジェクトにしています。
※この時、SphereのInsrectorウィンドウからTransform > Scaleのxyzを小さくしておくと良いです。(ここではすべて1にしておきます)
Qiita1-18.jpg

次は、File > Build Settingsを開きます。

PlatformにAndroidを選択して、右下のSwitch Platformをクリックします。
UnityのロゴがAndroidの横に表示されるようになったら、左下のPlayer Settingsをクリックします。
Qiita1-19.jpg

Playerタブにて、Company NameProduct Nameを入力。
Qiita1-20.jpg

Other Settings > RenderingからVulkanを選択して削除。
Qiita1-21.jpg

XR Settings > Vuforia Augmented Reality Supportedにチェック。
Qiita1-22.jpg

Vuforiaの設定

HierarchyウィンドウからARCameraを選択し、InspectorウィンドウのVuforia Behaviour > Open Vuforia configurationをクリック。
Qiita1-23.jpg

Global > App License Keyの欄に取得したLicense Key(A)を入力します。
Qiita1-24.jpg

次に、先程ダウンロードしたUnity package fileを開きます。
Qiita1-25.png

Importします。
Qiita1-26.jpg

HierarchyウィンドウからImageTargetを選択し、InspectorウィンドウのImage Target Behaviour > TypePredefinedに変更。
新たに表示されるDatabaseImage Targetに登録した情報を選択します。
Qiita1-27.jpg

AndroidアプリのBuild And Run

File > Build Settingsを開きます。

Add Open Scenesをクリックして、作成したSampleSceneが表示されていることを確認します。
確認出来たら、Android端末とPCを接続して右下のBUild And Runをクリックしてください。
Qiita1-28.jpg

ポップアップ画面では保存するapkファイル名を入力して、保存します。
Qiita1-29.jpg

しばらく待つとAndroid端末にアプリがインストールされます。!

アプリの作動確認

マーカーの用意

使用した画像を印刷するなどして、マーカーを準備しましょう。

作成した名前のアプリをAndroid端末上で起動し、カメラをマーカーに向けてみます。

きちんと表示されれば成功です。
Qiita1-30.png

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

【Unity】Listから条件に一致する要素をランダムに1個抽出する拡張メソッド

概要

LINQのWhereを極力使いたくない(Object allocationを極力避けたい)人向けです。

拡張メソッド

IEnumarableExtensions.cs
using System;
using System.Collections.Generic;
using System.Linq;
using Object = System.Object;
using Random = UnityEngine.Random;

public static class IEnumarableExtensions
{
    private static readonly List<int> RandomIndexList = new List<int>();
    private static readonly Object LockObject = new Object();

    /// <summary>
    /// ieが空だと例外になるので要素の存在チェックを行ってから実行しましょう
    /// </summary>
    public static T GetAtRandom<T>(this IEnumerable<T> ie, Func<T,bool> predicate)
    {
        if (!ie.Any())
        {
            throw new Exception("要素が空です!");
        }
        // 非同期実行時に同時アクセスしないようlockします
        lock (LockObject)
        {
            RandomIndexList.Clear();

            // 条件に一致する要素のindexを取得します
            for (int i = 0; i < ie.Count(); i++)
            {
                if (predicate(ie.ElementAt(i)))
                {
                    RandomIndexList.Add(i);
                }
            }

            if (RandomIndexList.Count < 1)
            {
                throw new Exception("一致する要素がありません!");
            }

            // 抽出したindexから抽選して返します
            int randomIndex = RandomIndexList[Random.Range(0, RandomIndexList.Count)];
            return ie.ElementAt(randomIndex);
        }
    }
}

ビフォアー

void RandomBefore()
{
    List<int> intList = new List<int> {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
    int[] randomPool = intList.Where(x => x % 3 == 0).ToArray();

    for (int i = 0; i < 10; i++)
    {
        Debug.Log(randomPool[(Random.Range(0, randomPool.Length)]);
    }
}

アフター

void RandomAfter()
{
    List<int> intList = new List<int> {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
    // ** Whereが要らなくなる!! **
    for (int i = 0; i < 10; i++)
    {
        Debug.Log(intList.GetAtRandom(x => x % 3 == 0));
    }
}

備考

タイトルには便宜的にListと書いてますが、IEnumerableを継承してれば使えます。
乱数の再現、シード値の固定をやりたい方は各自調整ください。

追記

大抵の場合、IReadOnlyListで間に合い、こちらの方が早いと紹介頂いたので、こちらにも載せます。

IReadOnlyListExtensions
using System;
using System.Collections.Generic;
using Object = System.Object;
using Random = UnityEngine.Random;

public static class IReadOnlyListExtensions
{    
    private static readonly int[] TempIndices = new int[1024];
    private static readonly Object LockObject = new Object();

    /// <summary>
    /// 候補が空のときはdefault値を返します
    /// </summary>
    public static T GetAtRandom<T>(this IReadOnlyList<T> ir, Func<T,bool> predicate)
    {
        lock (LockObject)
        {
            int count = 0;
            // 条件に一致する要素のindexを取得します
            for (int i = 0; i < ir.Count; i++)
            {
                if (predicate(ir[i]))
                {
                    TempIndices[count] = i;
                    count++;
                }
            }

            if (count == 0)
            {
                return default;
            }

            // 抽出したindexから抽選して返します
            int randomIndex = TempIndices[Random.Range(0, TempIndices.Length)];
            return ir[randomIndex];
        }
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity 2019.3.4f1などのAssembly-CSharp.csprojでPackageのアセンブリ参照が行われていない場合

こんにちは、Densyakunです。

Unityをアップデートしてゲームを開発していたら、
VSCode(OmniSharp)にて、
一部の参照(すべてUIやEventSystemsなどのPackage)に、
OmniSharp.MSBuild.ProjectLoader does not exist
というエラーが出ており、
参照が見つからないようでした。

しかしUnityEngineなどは正常に参照できています。

パスを見るとUnityプロジェクトフォルダ内を参照しようとしており、
Assembly-CSharp.csprojを確認すると、
パスが書かれていませんでしたが、
Unityがcsprojを管理しているため書き換えても直りません。

以前他の問題で参照のエラーが起きていたときの解決策として、
.csprojを削除してから、
Assets>Open C# ProjectまたはProjectタブを右クリック>Open C# Projectで、
.csprojを再生成してみたのですが、直りませんでした。

解決

どのバージョンからなのか、いつからかは知りませんが、
私がアップデートしたUnity 2019.3.4f1では、
Package毎に.csprojファイルが分割されているため、
Assembly-CSharp.csprojには、Packageを除いた基本的なものしか参照がありませんでした。

Edit>Preferences...でUnity本体の設定(バージョンごとに設定が分かれています)を開き、
External ToolsのGenerate all .csproj files.にチェックを入れることで、
すべての.csprojファイルを生成するようにします。

それから.csprojを削除して
Assets>Open C# ProjectまたはProjectタブを右クリック>Open C# Projectで、
.csprojを再生成すると直ります。

バージョンごとにUnityの設定が分かれていること、
新しい設定がオフになっていることにより、
デフォルトでAssembly-CSharp.csprojしか生成しないようになっているため、
このようなことになっていました。

解決はしたのですが、
以前よりOmniSharp(C#拡張機能)の起動時間が、
遅くなりました。

検索しても解決方法が載っておらず、
自分で調べることで解決することができましたので、
記事にしました。
以上です。

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

UnityでVisual Studioの自動補完/候補が出ない

経緯

新しいPCでUnityを始めた際に、VisualStudioで予想変換/自動補完(インテリセンス)が出なくて困っていました。今まで使っていた環境では「g」と入力すれば、「GameObject」が候補に出たのに……

症状

こちらの記事 を参照しましたが
そもそもソリューションウインドウ上でも更新マーク(:arrows_counterclockwise:)も表示されず。

原因

Unity側のC#のエディタがVisualStudioになっておらず
C#スクリプトがUnityのProjectと紐づいていませんでした。
ソリューションファイル(.sln)も作成されていませんでした。

対応

Unity側のC#のエディタをVisualStudioに設定します。

結果

無事にインテリセンス(自動補完/候補)が表示されるようになりました。
gameObject.png

以上です。
お疲れ様でした。

参考

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