- 投稿日:2020-03-10T21:41:08+09:00
東京オリンピックのエンブレムを遊びつくす!(1)〜僕が何を作ったか〜
はじめに
大学の授業でオリンピックのエンブレムを応用して何か作品を作ってみるという機会を頂けたので、その記録を何回かに分けて書いていきたいと思います。幾何学の話をしたり、grasshopperの話をしたり、unityの話をしたりと内容が大きく変わりますが、興味のあるところだけでも読んでくれると嬉しいです!
また、unityとかgrasshopperとか興味あるけど、どんな風に作品に使えるかわからないという方も読んでいただけると嬉しいです!とまあ説明はこの辺りにして、まずは僕がどのような物を作ったのか紹介したいと思います。
完成品
僕が作ったのはオリンピックのエンブレムを作った幾何学を利用した映像作品です。
日出ずる国ということで日の出を表現しました。
これからの展望
大まかに分けて以下のような構成でブログを書いていくつもりです。
1.僕が何を作ったか
2.エンブレムに隠された法則
3.ひし形充填の基本
4.grasshopperでひし形充填をする
5.左右対称にひし形を充填する
6.unityでひし形充填をする
7.日の出を作る
- 投稿日:2020-03-10T18:55:44+09:00
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をクリックします。
License名を入力して、ボックスにチェックを入れた後、
ConfirmしてDevelopment Keyを作成します。
上手くいくと作成したKeyが表示されるので、クリックします。
(画像では隠していますが)
License Keyが表示されているので、クリックしてコピーしておきましょう。
後ほどUnity上で使用します。(A)
Databaseの取得
DevelopのTarget Managerというタブから
Add Databaseをクリックします。
ポップアップ画面にDatabase名を入力して、
CreateでDatabaseを作成します。
マーカーに使用する画像ファイルを選択して、
Width(100で大丈夫)とNameを入力してAddをクリックします。
作成したTargetを選択して、
Download Databaseをクリックします。
ポップアップ画面上で、
Unity Editorにチェックを入れてダウンロードします。
ダウンロードしたUnity package fileは後ほど使用します。(B)
ARアプリの作成
UnityでARを実装していきます。
UnityにAndroid SDK & NDK Toolsを追加
Unity HubからUnity 2019.2.18f1にモジュールを追加します。
Android Build SupportとAndroid SDK & NDK Toolsにチェックを入れて、実行します。
これでAndroid SDK & NDK Toolsが追加されました。
Unityでプロジェクトを作成、設定
Unity 2019.2.18f1で3Dを選択し、プロジェクト名を入力してプロジェクトを作成します。
まずは、Vuforia Engine ARをインストールします。
Window > Package Managerをクリックします。
Vuforia Engine ARを開いて、Installします。
HierarchyウィンドウからMain Cameraを削除します。
続いて、下記の2つのGameObjectを追加します。
GameObject > Vuforia > AR CameraGameObject > Vuforia > Camera Image > Camera Image Target表示したい3Dオブジェクトを作成します。
ここでは、GameObject > 3D Object > Sphereを作成し、ImageTargetに対してドラック&ドロップすることで子オブジェクトにしています。
※この時、SphereのInsrectorウィンドウからTransform > Scaleのxyzを小さくしておくと良いです。(ここではすべて1にしておきます)
次は、
File > Build Settingsを開きます。PlatformにAndroidを選択して、右下の
Switch Platformをクリックします。
UnityのロゴがAndroidの横に表示されるようになったら、左下のPlayer Settingsをクリックします。
Playerタブにて、
Company NameとProduct Nameを入力。
Other Settings > RenderingからVulkanを選択して削除。
XR Settings > Vuforia Augmented Reality Supportedにチェック。
Vuforiaの設定
HierarchyウィンドウからARCameraを選択し、Inspectorウィンドウの
Vuforia Behaviour > Open Vuforia configurationをクリック。
Global > App License Keyの欄に取得したLicense Key(A)を入力します。
次に、先程ダウンロードしたUnity package fileを開きます。
Hierarchyウィンドウから
ImageTargetを選択し、InspectorウィンドウのImage Target Behaviour > TypeをPredefinedに変更。
新たに表示されるDatabaseとImage Targetに登録した情報を選択します。
AndroidアプリのBuild And Run
File > Build Settingsを開きます。
Add Open Scenesをクリックして、作成したSampleSceneが表示されていることを確認します。
確認出来たら、Android端末とPCを接続して右下のBUild And Runをクリックしてください。
ポップアップ画面では保存するapkファイル名を入力して、保存します。
しばらく待つとAndroid端末にアプリがインストールされます。!
アプリの作動確認
マーカーの用意
使用した画像を印刷するなどして、マーカーを準備しましょう。
作成した名前のアプリをAndroid端末上で起動し、カメラをマーカーに向けてみます。
- 投稿日:2020-03-10T18:41:36+09:00
【Unity】Listから条件に一致する要素をランダムに1個抽出する拡張メソッド
概要
LINQのWhereを極力使いたくない(Object allocationを極力避けたい)人向けです。
拡張メソッド
IEnumarableExtensions.csusing 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で間に合い、こちらの方が早いと紹介頂いたので、こちらにも載せます。
IReadOnlyListExtensionsusing 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]; } } }
- 投稿日:2020-03-10T01:46:17+09:00
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#拡張機能)の起動時間が、
遅くなりました。検索しても解決方法が載っておらず、
自分で調べることで解決することができましたので、
記事にしました。
以上です。
- 投稿日:2020-03-10T01:17:16+09:00
UnityでVisual Studioの自動補完/候補が出ない
経緯
新しいPCでUnityを始めた際に、VisualStudioで予想変換/自動補完(インテリセンス)が出なくて困っていました。今まで使っていた環境では「g」と入力すれば、「GameObject」が候補に出たのに……
症状
こちらの記事 を参照しましたが
そもそもソリューションウインドウ上でも更新マーク()も表示されず。
原因
Unity側のC#のエディタがVisualStudioになっておらず
C#スクリプトがUnityのProjectと紐づいていませんでした。
ソリューションファイル(.sln)も作成されていませんでした。対応
Unity側のC#のエディタをVisualStudioに設定します。
結果
無事にインテリセンス(自動補完/候補)が表示されるようになりました。
以上です。
お疲れ様でした。参考































