- 投稿日:2020-11-27T23:19:31+09:00
Oculus Integration
Assembly with name 'Unity.XR.Oculus.Editor' already exists (Packages/com.unity.xr.oculus.android/Editor/Unity.XR.Oculus.Editor.asmdef)
Assembly with name 'Unity.XR.Oculus.Editor' already exists (Packages/com.unity.xr.oculus/Editor/Unity.XR.Oculus.Editor.asmdef)
- 投稿日:2020-11-27T18:58:41+09:00
Instance IDの定義
今回の主な話題:Instance IDの定義、モデルMesh Compression導入設置、Static BatchingがDrawCallへの影響。
アセット管理
Q1:公式ドキュメントでInstance IDへの定義は次のとおりです。
「The instance id of an object is always guaranteed to be unique.」
したがって、一つのSpriteアセット、ゲーム内のInstance IDは唯一はずですが、テスト中に妙な問題が起こしました。
これはプリントImageにあるSpriteのInstance IDですが、アセットファイルにこの画像を選択し、InspectorのDebugモードで表示されたInstance IDと一致しません。
後で、Imageに対応するSpriteのGUIDをプリントしました。.metaファイルのGUIDに対応しているため、Instance IDに一致性がない理由がわかりません。私はそう理解しています。コードで取得したInstance IDと、Inspectorで確認された画像のInstance IDが属するオブジェクトはインスタンスではありません。つまり、Instance IDの唯一性は具体的なアセットではなく、オブジェクトインスタンスに対するものです。
たとえば、プロジェクト内のPrefabファイルのInstance IDと、シーン内のインスタンス化されたオブジェクトのInstance IDも異なります。
アセット管理
Q2: 3Dモデルをインポートすると、Mesh Compressionの設置は、最終的にどんな結果を導きますか?Unityのドキュメントを読んだで、それはメッシュのストレージの圧縮最適化にすぎないようです。直接的な利点は、パッケージ本体が小さくなることですが、一部のモデルが変形しやすくなることもあります。
では、問題は下記のようです。
1)ロード時には圧縮により遅くなりますか?または、圧縮完了後にMeshにロードして初期化する速度は早くなれますか?(パッケージが小さくなりましたから)
2)これを開くと実行中のパフォーマンス最適化に役立ちますか?
3)このスイッチは法線効果に影響しますか?
4)このオプションを開くことをお勧めしますか?1)数値上の精密桁数のみが削減されるため、ロード速度の差は小さいはずです。さらに、メッシュ自体がそれほど大きくない場合、ロード速度は非常に高速ですから、ロードの違いを気にする必要はありません。
2)ドキュメントによると、Compressionをオンにするかどうかに関係なく、ロード後にメモリ占用が同じになりますから、実行時のパフォーマンスに違いはないはずです。
3)法線の部分が圧縮されるかどうかは本当に言いにくいので、具体的なプロジェクトと組み合わせて確認する必要があります。
4)このオプションを有効にするかどうかは、モデル自体によって異なります。アーティストさんが視覚的に許容できると感じる限り、Compressionをできるだけ高く選択すれば良いです。
レンダリング
Q3:UWA Blogで前の記事を読みましたが、一つ疑問があります。なぜStatic BatchingはDrawCallの数 に影響しませんか?
正確には、Unityバージョン5.0〜5.3で、Static BatchingはGraphics DriverにあるDraw Callの回数を影響しません。これは、これらのバージョンでは、Unityが4.xのようにindex bufferを動的にバッチ処理しないためです。この点は、UWA DAYでもう詳しく説明しました。
ただし、Unity 5.4バージョン以降、Draw Callバッチ操作は元に戻され、以前の4.xと同じであるため、現在Unity 5.5、5.6、および2017以降のバージョンを使用している場合は、Static Batching後にDraw Callは変わる可能性があります。
コード
Q4:サブクラスが親クラスのシリアル化されたフィールドがInspectorに表示されないようにする方法はありますか?注:親クラスフィールドはvirtulではありません。
PropertyAttributeは実現できはずです。考え方は大体次とおります。PropertyDrawerは、OnGUIの時にSerializedObjectのタイプを判断し、それが親クラスである場合にのみ本格的な描画を行います。
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、パフォーマンス分析と最適化ソリューション及びコンサルティングサービスを提供している会社でございます。
UWA公式サイト:https://jp.uwa4d.com
UWA公式ブログ:https://blog.jp.uwa4d.com
- 投稿日:2020-11-27T18:52:30+09:00
UGUILateBindingの使用注意事項
今回の主な話題:UGUILateBindingの使用注意事項、UpdateRendererBoundingVolumes関数の役割、ToArrayが生成するヒープメモリ割り当ての回避。
アセット管理
Q1:UGUIとSpriteAtlasが生成するAssetBundle依存関係に関する一つの問題を聞きたいです。以下のテストをしました、環境はUnity2018.1です。
一つのUI Prefabは:
その中の三つのImageは次のようになります。
三つのImageは異なるテクスチャを引用していますが、これら3つのテクスチャは同じSpriteAtlasに手動で配置し、Include in buildオプションを削除します。
UI PrefabとSpriteAtlasをそれぞれ2つの異なるAssetBundleに入れ、この時、前者は後者に依存関係はないことがわかりました。
ただし、AssetBundleのサイズから、ImageAssetは二つのAssetBundleに繰り返し入力されていないことが簡単にわかります。
AssetBundleの方法でこのUI Prefabを表示したい時に、事前にSpriteAtlasをロードせず、SpriteAtlasManager.atlasRequestedコールバックを書かない場合、確かにエラーが発生します。
これから推測できますのは、このPrefabは実際にある方式で自分が使うべきアトラスを分かります。問題は、AssetBundleManifestを介してアトラスへの依存関係を取得できないため、どうせればこの依存関係を適切に処理できますか?つまり、どうすればこのUI Prefabをロードする前にどのSpriteAtlasまたはSpriteAtlasをロードする必要があるかを知れますか?まず、Late Bindingは本当に要るかどうかを確認することをお勧めします(Include in buildをチェックしません)。Late Bindingをオンにすれば、UnityがPrefabとAtlasの依存関係を解けることは納得できます。以前に、Prefabをロードまたはインスタンス化する前に依存アセットを必ず準備する必要がありましたから。しかし、Late Bindingには不要です。したがって、実際にLate Bindingが必要ない場合は、「Include in build」をオンにすればいいです。ただ一つのBugにあう可能性があり、Atlasの冗長性を導きますが、それでも避けられます。
Bugはこちらに:https://answer.uwa4d.com/question/5a822325847802258a06509e (中国語注意)
Late Bindingが本当に必要な場合は、SpriteAtlasManager.atlasRequestedのコールバックで現在RequestされたAtlasのTagを取得できます。そしてこのTagに基づいて対応するAtlasをロードできます。(Late Binding規則のため、ここでのロードは同期的に完了する必要はありません)
Monoメモリ
Q2:プロジェクトでLineRendererを使用しました。線を引くときにSetPositions(Vector3 [] position)をコールし、パスはListに保存されます。何かToArrayの割り当てを回避する方法はありますか?
①
Listをトラバースし、LineRenderer.SetPosition(int index, Vector3 position)をコールします。
②
プールを使用して、配列のサイズを見積もり、そして直接に渡します。テーリングを行うと、ポイントが長期間存在しないため、アセットを節約できし、list変換のコストも節約できます。これらの空きポイントは1つの位置にグループ化できます。これはあまり消費せず、安定しています。
③
私はこのような仕事をよくやりました。C#がエンジンインターフェイスにコールされた時、データはコピーされるため、ある方法で渡されたデータを少し処理することは必要です。
たとえば、渡した配列の実際のサイズは10ですが、長さは非セキュアコードによって一時的に10未満の値に変更され、APIコールの完了後に元に戻されます。これは、メモリ変更でゲームデータを変更するに少し似ています。前提は、コールするAPIがエンジンからエクスポートされることを確認する必要があります。デコンパイラツールを使用してこのAPIの声明を確認して、InternalCallは、このAPIがエンジンによってエクスポートされることを示しているため、このhack方法を使用できます。// UnityEngine.LineRenderer [GeneratedByOldBindingsGenerator] [MethodImpl(MethodImplOptions.InternalCall)] public extern void SetPositions(Vector3[] positions);最初にコードを投稿します。値タイプの配列の場合、これを行うことができます。
この例では、Byte配列をVector3配列に置き換えでも問題はありません。[StructLayout( LayoutKind.Sequential )] struct ArrayHeader { internal IntPtr type; internal ArraySize_t length; } public unsafe static T HackArraySizeCall<T>( Byte[] array, int size, Func<Byte[], T> func ) { if ( array != null && func != null ) { if ( size < array.Length ) { fixed ( void* p = array ) { ArrayHeader* header = ( ( ArrayHeader* )p ) - 1; var oriLength = header->length; header->length = ( ArraySize_t )size; try { return func( array ); } finally { header->length = oriLength; } } } else { return func( array ); } } return default( T ); }例のコードを使ってわずかに変更できます。最初にパブリックVector3配列を使用して手動でキャッシュし、listを置き換え、有効なデータを自分で記録します。APIを渡す必要がある場合は、このhack関数を使用してメモリコストのコールを1回騙します。
④
直接にVector3 []を使用してパスを保存するのが一番いいですが、その他は二番目良いソリューションです。
Hackまで言及したら、リフレクションによってListのitemsを取得することは問題ではないはずです。ただし、このitemsの長さはcapacityであることに注意してください。
レンダリング
Q3: 妙な問題に遭遇しました。線を引くシェーダーを実現したいのですが、DrawCallをマージするために、線の速度Speedと線のスケールYScaleを法線Normal.xとnormal.yに入れてシェーダーに渡し、C#でmesh.normalを使って法線を直接に指定します。
しかし、変なことが起こりました。シェーダーで取得されたnoraml.xの値は正常であり、normal.yの値は異常でした。これにより、線の速度も異常になります。タンジェントを使っても同じに、xの値は正常でありますが、他の値は異常です。
理解しにくいのは、Sceneシーンで線の速度が正常であります。つまり、SceneにShaderが取得する法線は正しいでしたが、Gameシーン内の速度は間違いました。これは、GameシーンでShaderが取得する法線の値が異常であることを説明しました(xの値以外、x値は両方のシーンで正しかった)。
Dynamic Batchingの問題かもしれません。Batchingをやりたいから、頂点に対して、モデルスペースが変更されたため、NormalもTangentも従って変更します。
UV3またはUV4を使ってカスタムデータを保存することをお勧めします。
制作
Q4: Unityで内部可動車両機能を実現するにはどうすればよいですか? たとえば、World of Warcraftのエレベーターと飛行船。
現在目にある問題:
1)CharacterControllerを使います。キャラクターは車両にバインドされず、自分で重力をシミュレートしますが、キャラクターは揺れ、または車両は水平に移動するときにキャラクターを運転できません。
2)CharacterControllerを使います。キャラクターを車両とバインドしますが、CCには局部変位を行う方法がないようです。
3)CharacterControllerを使用せず、rayで完全に書き換えます。仕事の量は大きすぎです。同じような機能を行った人がいませんか?経験を教えてください。
①
デザインの筋を推測します。
キャラクターの水平座標=車両の水平座標+キャラクターの相対変位;
キャラクターの向き=車両の向き+キャラクターの相対的な向き;
キャラクターの高さ=キャラクターの水平座標に対応する車両の上面。1)CCを変更して、キャラクター移動操作のロジックを再利用しますが、操作の結果は、キャラクターの相対的な変位とキャラクターの相対的な向きになります。
2) キャラクターが車両にバインドされているかどうかは問題ありませんが、バインドしない方が柔軟です。
3) キャラクターの高さは射線を使って車両メッシュに垂直に衝突し、重力は必要ありません。②
CharacterControllerは、移動時に単位係数があって、車両が移動するときにも係数を持ちます。この2つを足して最終係数を取れます。したがって、車両の上に立って動かなくても、主人公は車両を追跡して移動します。
③
最終案はCCを使用することでした。重要な点は、すべての変位操作をFixed Updateに入れる必要があることです。そうしないと、ジッターが発生します。バインドは不要です。車両の各フレームの相対変位を記録し、ジャンプなどの操作に慣性を追加すれば大丈夫です。
レンダリング
Q5: Unityエンジンが5.4から5.6.6にアップグレードされた後、UWAパフォーマンスレポートの「CPU占用の高い関数」リストにUpdateRendererBoundingVolumesという関数が追加されました。この関数は何に使用されますか?
UWAから見ると、これはUnityエンジンがレンダリング前、LateUpdate後のオブジェクトに対するバウンディングボックスの更新です。シーン内の動的オブジェクトが多いほど、コストが高くなります。下図のように。
UWAが最適化したプロジェクトでは、コストは主にパーティクルシステムとSkinned Meshの数に関連します。この値が大きい場合、一般的にActiveのパーティクルシステムとスキンメッシュの多い大きいシーンに存在します。MOBA、超大シーンMMOやPUBGみたいなゲームによく見られます。もちろん、妙な問題も発生しました。たとえば、Unity 2017以降の一部のプロジェクトでは、NGUIとパーティクルシステムの組み合わせによって異常なコストが発生しましたが、これらは特殊なケースです。上記は、この関数の主なパフォーマンスコストです。これを理解した後、最適化のターゲットも明確できます。つまり、シーン内のActiveパーティクルシステムとスキンメッシュの数を可能な限り制御し、1〜2画面の外でそのようなゲームオブジェクトにDeactiveを行うことなどです。
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、パフォーマンス分析と最適化ソリューション及びコンサルティングサービスを提供している会社でございます。
UWA公式サイト:https://jp.uwa4d.com
UWA公式ブログ:https://blog.jp.uwa4d.com
- 投稿日:2020-11-27T18:39:58+09:00
Unity Asset Store でダウンロードしたパッケージを消す方法。(linux限定)【Unity】
cd ~/.local/share/unity3d/ cd Asset Store-5.x/[Asset作者のアカウント名] rm [パッケージ名].unitypackage
- 投稿日:2020-11-27T18:23:49+09:00
Quest2でファイルが参照できない問題の解決法
OculusQuest2で
READ_EXTERNAL_STORAGE
権限を与えてもファイルが参照されない問題についての解決法が分かったので備忘録としてQiitaに置いときます。。経緯
Quest1からQuest2に同じアプリをビルドしてみたタイミングでvideoplayerでurl指定したはずの動画が流れず
原因
Quest2がandroid10になっていた(Questは8.0)
解決方法
手順1
android:requestLegacyExternalStorage = "true"
をAndroidManifest.xml
のアプリケーションタグに追加する。AndroidManifest.xml<?xml version="1.0" encoding="utf-8" standalone="no"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto"> <application android:label="@string/app_name" android:icon="@mipmap/app_icon" android:allowBackup="false" android:requestLegacyExternalStorage="true"> <activity android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" android:configChanges="locale|fontScale|keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode" android:launchMode="singleTask" android:name="com.unity3d.player.UnityPlayerActivity" android:excludeFromRecents="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> <meta-data android:name="com.oculus.vr.focusaware" android:value="true" /> </activity> <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="false" /> <meta-data android:name="com.samsung.android.vr.application.mode" android:value="vr_only" /> <meta-data android:name="com.oculus.supportedDevices" android:value="quest|delmar" /> </application> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-feature android:name="android.hardware.vr.headtracking" android:version="1" android:required="true" /> </manifest>AndroidManifest
textファイルなのでxmlに変換してAssets/Plugins/Androidに置く。手順2
bildtoolのバージョンを上げる。(android:requestLegacyExternalStorage = "true"
がapiレベル29で追加されたものなのでbildtoolのバージョンを上げないとエラーが起きる。)unity/projectname/Temp/gradleout/unityLibraryに入ってるbuild.gradleファイルを開きbuildToolsVersionを29.0.2にする。(build.gradleファイルがない場合1度ビルドすれば現れる)
build.gradle// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN apply plugin: 'com.android.library' dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation(name: 'OVRPlugin', ext:'aar') } android { compileSdkVersion 29 buildToolsVersion '29.0.2' compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } defaultConfig { minSdkVersion 23 targetSdkVersion 29 ndk { abiFilters 'armeabi-v7a' } versionCode 1 versionName '0.1' consumerProguardFiles 'proguard-unity.txt' } lintOptions { abortOnError false } aaptOptions { ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~" } packagingOptions { doNotStrip '*/armeabi-v7a/*.so' } }unity/2019.4.10f1/Editor/Data/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates/mainTemplate.grableのbuilToolVersionをあげれば出来るはずだがなぜかエラーが起きた・・・
このbuild.gradleを直接変更する方法はビルドのたびにやらないといけないらしいので面倒。。
==またわかり次第追記します==
- 投稿日:2020-11-27T16:01:54+09:00
はじめての Mixed Reality アプリ開発(1) 環境構築の巻
皆さんこんにちは。マイクロソフトでDevRelを担当している鈴木です。今年最も注力しているといっても過言ではない「Mixed Reality Dev Days Japan」のイベント開催を目前に何かやろうと思い立ち、ふと目の前にGPUを搭載したWindowsマシンが転がっていて、先ほどHoloLens 2も届いたので、前提知識ゼロの私がイベント開催までにMixed Realityをアプリをどこまで作れるのか試してみるコーナーを勝手に作りました! 目指せMRの民主化!
ちなみに大学ではComputer Scienceを専攻してC++(C#じゃなくてC++とかアセンブラ)を書きながら、ゼミではVRの研究もしていたはずなんですが、卒業以来ほとんどコード書いてないし、開発という開発に携わってません、そんな初学者にもバッチリなMicrosoft Learnという学習コンテンツもあると聞いたのでなんとかなるはず!
はい、番宣はここまで。それではここからガチでやっていきます。そもそもWindowsマシンを触るのもかなり久しぶりなので、スクリーンショットのショートカットから調べてます。汗
Windows Mixed Reality 開発環境のセットアップ
何はともあれまずは公式ドキュメントを見ていきます。あまり知られてないんですがマイクロソフトは公式のドキュメントが充実してます。ただドキュメントは膨大な量でそれなりに更新されているので翻訳はだいたい機械翻訳です。もし日本語が読みづらいと感じたら英語のドキュメントも確認してみてください。
概念・概要もとてもとても重要ですが真っ先にアプリ開発を試したい私は迷わず開発者向けと書かれたページに進んでいきます。
ふむふむ、どうやらMR開発には3つの開発オプションが存在するようです。
- Unity
- Unreal
- Native (OpenXR)
とりあえず最後のNativeは明らかに玄人っぽいにおいがしたので、UnityかUnrealを選んでいくことにします。ここではMicrosoft Learnのモジュールにも登場しているUnityでセットアップします。
MR開発といってもいきなりホログラムを使った開発ができるわけではありません。なのでMixed Realityツールキット (MRTK) としてあらかじめ用意されているものを使います。いわゆるSDK (Software Development Kit) ですね。
ここからはこのLearnのモジュールをベースにして残りの作業を進めていきたいと思います。まず必要なのがこれらツールのインストールです。
Windows 10 PC
- Windows 10
- Visual Studio 2019
- Windows 10 SDK
- HoloLens 2 エミュレーター
Unity
- Unity 2019.2.X がインストールされている Unity Hub
- Unity のインターフェイス、シーンの作成、パッケージのインポート、シーンへの GameObjects の追加に関する基本的な知識
- MixedRealityToolkit-Unity
Windows 10のマシンはすでに最新バージョンになっていたので、さっそくVisual Studio 2019のインストールをはじめます。執筆時点での最新バージョンは16.8.2でした。
Visual Studioのインストールウィザードを進めていきます。ここでワークロード・目的別に必要なコンポーネントを一括でインストールできます、MRアプリ開発には、デスクトップとモバイルにある
- C++ によるデスクトップ開発
- ユニバーサル Windows プラットフォーム (UWP) の開発
が必要です、オプションとして
- Unity によるゲーム開発
にもチェックしておくと、のちのち必要になるUnity Hubが一緒にインストールできて便利です。なお、全体で17GBとかになるのでストレージ容量と時間に余裕をもってお試しください。いちど再起動を求められました。
続いてWindows 10 SDKですが、先ほどのC++ によるデスクトップ開発を選択していればコンポーネントに含まれているはずです。MRアプリはWindowsアプリの一種ということなんですね、他に単独のインストーラーも用意されています。
まだまだあります、今度はエミュレーター、実際のHoloLensで動かす前にWindowsマシン上のエミュレーターでアプリを起動できます。エミュレーターに必要なのは10.4GB、そろそろ専用の開発マシンが欲しくなりますね。。ここでも再起動を求められました。
Unity 2019のセットアップ
さて、ここからはUnity側の設定に移りましょう。Visual Studioの設定時にUnity Hubと呼ばれるツールをインストールしているのでそれを起動します。初回ではライセンスがないと表示されるので、まだ取得していない場合は登録しておきましょう。
Unity IDを発行して、ライセンスを取得します。
ライセンスが反映された状態でUnity Hubにログインし、最新のUnityをインストールしておきましょう。ここでは推奨リリースとなっている 2019.4.15f1 (LTS) で進めていくことにします。ちなみにDev toolsとしてすでにインストール済みのVisual Studioを指定しておくと、Visual StudioからUnityの機能を呼び出せるようになります。
まとめ
環境構築って本当にいろんなものを用意する必要があって、必ずしもワンパッケージになっているわけではありません。そのため自分がいま何をしているのか、何のためにこのツールをインストールしているのかよくわからなくなることが多々あります。ここで各ツールが何をしているのか簡単におさらいしておきましょう。
- Visual Studio:IDEと呼ばれる統合開発環境、MR開発以外にも様々なシーンで使われている万能ツール
- Windows 10 SDK:HoloLensなど実際のデバイス上で動かす際のUWP (Universal Windows Platform) 開発に必要
- Unity:今回のMRアプリ開発でメインで用います、VR/AR開発でもよく用いられる3D開発のゲームエンジン
- MRTK (Mixed Reality Toolkit -Unity, -Unreal) オープンソースで開発が進められているMixed Reality開発用のツールキット
次回はUnityのセットアップを進めていきます!
- 投稿日:2020-11-27T15:57:13+09:00
toio SDK for Unity で、iPhoneなどでtoio実機に接続するまでのざっくりとした流れ(無課金でok)
この記事でできること
- toio SDK for Unity で、unityプロジェクトのあとにtoioへ接続して実機確認ができる状態になる。
非常に参考となる情報
モリカトロン
やり方
unity編
- iOSのプラットフォームでビルドする。
xCode編
プロジェクトを開く
- ビルド後のフォルダ内にある拡張子「.xcodeproj」を選択。
端末選択する
- エディタの上部にあります。
その他の設定事項
- 要は、自分のAppleIDと紐付けてあげれば良い。
iPhone編
- アプリの使用許可
「設定」→「一般」→「プロファイルとデバイス管理」→「デベロッパAPP」→「"Apple Development: xxx@xxx.xxx"を信頼」→「信頼」
信頼
これでアプリ起動と同時に、toio実機も動き出します。
- 投稿日:2020-11-27T03:01:03+09:00
LineRendererで割ときれいな線を描いてみる
はじめに
この記事は以下のサイトの記事を参考にさせていただいてます
https://qiita.com/7of9/items/3750d30590e3efcfd389注意
最適化までは行っていないのでその点はご注意ください
仕様的なもの
- 受け渡されたor設定された座標をつなぎ合わせて1本のきれいな線を描く
- Z軸は使用しない
コード部分
DrawLine.csusing System.Collections; using System.Collections.Generic; using UnityEngine; public class DrawLineUI : MonoBehaviour { [SerializeField] private Material lineMaterial; // 線に使うマテリアル [SerializeField] private Color lineColor; // 線の色 [SerializeField] private float lineWidth; // 線の太さ [SerializeField] private List<GameObject> objList; [SerializeField] private List<Vector2> positionObjList; // 追加されたゲームオブジェクトのリスト private List<GameObject> addGameObjectList = new List<GameObject>(); void Start () { DrawLine(); } private void DrawLine() { List<Vector3> positionList = new List<Vector3>(); positionList = StoringVector2ToVector3(positionObjList); for(int index = 0;index < positionObjList.Count - 1;++index) { CreateLine(positionObjList,index); } } // Vector2のリストを持ってきて、SetActiveを確認しながらCreateLineに使うListに格納していく private List<Vector3> StoringVector2ToVector3(List<Vector2> positionObjList) { List<Vector3> positionList = new List<Vector3>(); for(int index=0;index<positionObjList.Count;++index) { if(objList[index].active == false) { //gameObjectが設定されていない場合に飛ばす continue; } } positionObjList.Add(positionList[index]); return positionObjList; } // 新しいオブジェクトを作ってLineRenderともろもろの設定を突っ込むとこ private void CreateLine(List<Vector3> vec3List, int indexNum) { List<Vector3> myPoint = new List<Vector3>(); // LineRendererのPositionを設定するのに使用 for(int idx = 0; idx < 2; idx++) { myPoint.Add(new Vector3(vec3List[indexNum + idx].x, vec3List[indexNum + idx].y, 0.0f)); } // 生成するオブジェクト名 GameObject newLine = new GameObject ("Line"+addGameObjectList.Count); addGameObjectList.Add(newLine); LineRenderer lineRenderer = newLine.AddComponent<LineRenderer> (); lineRenderer.useWorldSpace = false; lineRenderer.SetVertexCount(2); lineRenderer.SetWidth (lineWidth, lineWidth); lineRenderer.SetColors(lineColor,lineColor); // 色の設定 if(lineMaterial != null) { lineRenderer.material = lineMaterial; } Vector3 startVec = myPoint[0]; Vector3 endVec = myPoint[1]; lineRenderer.numCapVertices = 90; lineRenderer.SetPosition (0, startVec); lineRenderer.SetPosition (1, endVec); } }最後に
LineRenderer複雑ですね~
もうちょっと簡単に線を実装できたらいいんですけど・・・・