- 投稿日:2020-10-19T23:24:27+09:00
【Unity】Randomまとめ
はじめに
ゲーム製作においてRandomを使用する場面は多いと思います。
備忘録としてRandomクラスをまとめてみました。
なお、本記事ではUnityEngine.Random
について記載しています(System.Random
ではない)。Static Properties
insideUnitCircle
半径1の円の内部の点をランダムに返す。
円形上にランダムに敵を出現させたい場合などに使用。
insideUnitSphere
半径1の球体の内部の点をランダムに返す。
球体内部全てなので、浮いてるオブジェクトなどにも使用可能。
onUnitSphere
rotation
rotationUniform
一様な分布でランダムに
Quaternion
を返す。
Random.rotation
では完全なランダムではないみたいです。ただ計算コストはこちらの方が高い。state
乱数生成器の内部状態のすべてを取得、または、設定する。
適当なタイミングでアプリを落としても、再度起動したときに続きからできるようにするために乱数を保存する。value
0.0と 1.0の範囲のランダムな数を返す。
0.0と1.0も含むことに注意。汎用性が高く、Randomクラスのプロパティで基本的に使うのはこれ。Static Methods
ColorHSV
HSVでアルファ値(透明度)をもつランダムな
Color
を返す。
パラメータで色相(hueMin,hueMax)、彩度(saturationMin,saturationMax)、明度(valueMin,valueMax)、アルファ値(透明度:alphaMin,alphaMax)を設定可能。
InitState
シード値を指定し、ランダム数生成器の状態を初期化する。
システム時刻等で決定されるシード値を指定することで、同じ乱数の値を生成することができる。
シード値による擬似乱数については、以下の記事がわかりやすいです。
コンピューターの「ランダム」は本当にランダムなのか?Range
範囲を指定できる、
Random.value
。
intで設定するか、floatで設定するかによって、戻り値の範囲に差がある点に注意。int設定
\text{min}\leqq \text{return} < maxfloat設定
\text{min}\leqq \text{return} \leqq maxまとめ
- Randomクラスは様々な乱数を生成するクラス。
Random.value
とRandom.Range
の使用頻度が圧倒的に高い。Random.rotation
とRandom.rotationUniform
の違いは後日検証したい...
- 投稿日:2020-10-19T21:12:59+09:00
collisionEnterで、当たったオブジェクトの名前を出力する
コード
void OnCollisionEnter(Collision collision) { string hitObjectName = collision.gameObject.name; //当たったオブジェクトの名前 Debug.Log(hitObjectName); }thisはscriptをアタッチしたオブジェクトの名前が出力される
void OnCollisionEnter(Collision collision) { if(collision.gameObject.tag == "Player") { string thisOjectName = this.GetComponent<Collider>().gameObject.name; Debug.Log(thisObjectName); } }
- 投稿日:2020-10-19T21:11:32+09:00
Unity オブジェクト間の距離を求める
オブジェクト間の距離を求めるにはVector3.Distanceを使う。(今日知った泣)
using UnityEngine; using UnityEngine.UI; public class DistanceController : MonoBehaviour { public GameObject MajorObj; public GameObject Surface; public Text MajorText; // Update is called once per frame void Update() { Vector3 Apos = MajorObj.transform.position; Vector3 Bpos = Surface.transform.position; float dis = Vector3.Distance(Apos, Bpos); MajorText.text = "現在の距離: " + dis+ "m"; } }
- 投稿日:2020-10-19T20:24:28+09:00
VuforiaをSampleからやってみる
まえがき
ARコンテンツを簡単に作成することができるVuforia.
特徴は対応機種の多い,Unityに統合されている,比較的精度が良い等があげられます.
以前にも使ったことがあるのですが,機能も増えてさらに使いやすくなっているようです.
Sampleも充実しているので,一から試していこうと思います.本題
AndroidでVuforiaのSampleをビルドして試す
(※IOSへのビルドは少し異なります)機器概要
機器 バージョン Android 10 Windows10 Laptop --- Unity 2019.3.2f1 Android Stadio --- 手順
1. UnityでAndroidビルド環境を設定
詳しくは別記事に記載予定
・Android Stadioのインストール
・使用しているUnityのバージョンにAndroid用の設定をインストール2. projectを新規作成
3. Player settingsからAndroid用にSwitch
4. Asset StoreよりVuforiaSampleをImport
※Vuforia単体の場合はAssetStoreもしくはPackage ManagerからImport
5.ビルド
実行例と中身の確認
主なサンプルを試してみたのでまとめる
なおサンプルの画像はAsset/For Print
の中にPDFファイルがあるので印刷して利用
専用のソフトなどは公式ページからDLImage Targets(database)
画像をARマーカーとしてデータベースに登録し,Image targetとする
登録したImage targetの子オブジェクトとして表示させたいオブジェクトを配置することで追従させることが可能
Vuforia 画像マーカーのデモ pic.twitter.com/QCWsihu80W
— ゆーま (@sagirin262) October 19, 2020Model Targets
3DオブジェクトをCAD形式で登録し,Model targetとする
その形状に合う物体をキャリブレーションさせることでトラッキングすることが可能
Model Targetのデモ#Vuforia #Unity #unity3d #AR pic.twitter.com/fdvL4ouYnS
— ゆーま (@sagirin262) October 22, 2020VuMarks
好きなマークやロゴを識別できる形式にしてマーカーとする
VuMarksを作成するには専用のソフトVuMark-Designer
を利用する必要がある
Vuforia VuMarksのデモ pic.twitter.com/vikZdFb5qh
— ゆーま (@sagirin262) October 19, 2020Object Reco
スマホアプリの
Vuforia Object Scanner
を利用
特徴点からtargetをスキャンすることでマーカーを作成可能
Vuforia ObjectRecoのデモ pic.twitter.com/OcaQTUnMOn
— ゆーま (@sagirin262) October 19, 2020Multi Targets
Image Targetsの6面版
直方体のマーカーを認識することが可能
Vuforia 直方体のデモ pic.twitter.com/xcABGEoXqv
— ゆーま (@sagirin262) October 13, 2020Cylinder Targets
円柱をマーカーとし,認識することが可能
Vuforia 円柱のデモ pic.twitter.com/aQbcAnS0yo
— ゆーま (@sagirin262) October 13, 2020マーカーの作成について
ARマーカーを作成するにはアカウントを作成し,データベースに画像,モデルなどを登録する必要がある.
詳しくは以前の記事の準備を参照してください.あとがき
サンプルをいじったりしてみましたが,以前触った時よりも格段に良くなっていますね.
さらにVuforia7あたりから新たな機能が追加されており,そちらも今後触ってみたいと思います.
(Area Target Generator,Model Target Generator, GroundPlaneとMidAirなど)
また,スタンプデバイスのトラッキングにも活用できればと考えています.参考資料
Vuforiaでポジショントラッキングする手順とその周辺トピック
Vuforia7が結構すごいらしい
HoloLens製カートゲーム HADO KARTを現場に導入した話
Vuforia™トップ
Augment your spaces with Vuforia Engine
Automotive advantage: Vuforia Model Targets
- 投稿日:2020-10-19T19:30:31+09:00
【Unity2D】スペースキーでジャンプさせる
スペースキーの入力を受けとる
update関数の中にGetKeyDownでspaceキーの入力を受け取ります
void Update() { if (Input.GetKeyDown("space")) { } }Jump関数を作成
自身のRigidbody2Dを取得し、上方向に力を加えます。
Rigidbody2D rigidbody2D; void Jump() { // 上方向に力を加える rigidbody2D.AddForce(Vector2.up * 400); }Jump関数を呼びだす
void Update() { if (Input.GetKeyDown("space")) { Jump(); } }
- 投稿日:2020-10-19T19:09:28+09:00
[Unity]超絶初心者でもML-Agents Release8を動かす方法[Windows]
免責
この記事を見てる人は超絶初心者なので問題が起こったとしても私は責任を負わないこととします。また記事を見て進めた時点で同意したとみなします。またWindows以外のユーザーは今回扱いません。
バージョン確認
結構な速度で更新されてるML-Agentsですが
2020/10/19
時点の最新版であるML-Agents Release 8の環境構築とテストをしていきたいと思います。実行環境
わかりやすく言うと
インストールするものリスト
です。
バージョン インストール ML-Agents Release 8 未 Unity 2019.4.1f1 済 Anaconda3 2020.7 未 Python 3.7.9 未 Unityは2018.4以降が対応してますが、
今回はUnity2019.4.1f1
で進めていきます。
同様にPython3.6.1以降が対応してますが、
今回は仮想化とは???の人のためにAnacondaで仮想環境を作っていこうと思います。
Anacondaは後述で3.7環境を作るので、3.8対応の一番新しい2020.7(2020/10/19時点)を使います。
またUnityとUnity Hubはすでにインストールが済んでいる前提
で進めます。
当然ですがネット環境も必要です。
今回GPUでの学習に関しては動かすことが目的なので含んでいません、予めご了承ください。ANACONDA3インストール手順
既にインストール済みの方は飛ばしてください。
ダウンロード場所はAnaconda3のサイトをスクロールしたところにあります。
とりあえずNEXTで読み進めていってください。
今回はディレクトリを合わせるためJust Meで
インストール先のフォルダを聞かれますが今回はC:\Users\ユーザー名
\anaconda3に素直にインストールしましょう。
最後の項目ですが下の画像のようにチェックします。赤くなっていますが気にしないでOKです。
上の項目は面倒なパス
を通すために必要で、下の項目はあまり関係がないのですが今回Python3.7をメインに使う都合上外します。
チェックでき次第インストールしましょう。
インストールが済んだらコマンドプロンプト
を開いてconda
と打ち確認しましょう。
コマンドプロンプトがわからない方はWindowsの検索バーにcmdと打ちアプリを開きましょう。
開くと黒地に、
C:\Users\ユーザー名
>
と表示されているので
conda
と入力してエンター、以下のようにヘルプが出力されればインストール完了です。
今後このように
コマンドプロンプト
からコマンドを実行
する際は、$ condaのように表記するので
覚えておいて下さい
。($は、続くコマンドを実行する
の意味)ML-Agentsダウンロード手順
すでにダウンロードしている方はディレクトリ階層だけ合わせてください。
ML-Agents Release 8のサイトをスクロールしてSource code(zip)
をダウンロード、
C:\Users\ユーザー名
\ 直下に解凍しましょう。
ディレクトリはC:\Users\ユーザー名
\ml-agents-release_8 となるはずです。
フォルダ内のcom.unity.ml-agents
ファイルはUnityで使います。
- mlagents
- mlagents_envs
- gym_unity
のファイルは次のPythonのインストールの時に使います。
それぞれの働きについて詳しくはここを見てください。Python3.7インストール手順
コマンドを実行します。
$ conda create -n ml-agents python=3.7実行したら仮想環境の構築が終わるまでしばらく待ちましょう。
途中y/n?ときかれるのでyを押してエンター
動作が終わると、再び
C:\Users\ユーザー名
>
と表示されるのでそれから次のステップに移ります。
以降も同様に一つのコマンドの処理が終わるまで待って
から行ってください。$ conda activate ml-agentsコマンドプロンプトが、(ml-agents)C:\Users\
ユーザー名
> のように変化します。
これで仮想環境にライブラリを追加できます。$ pip install -e ./ml-agents-release_8/ml-agents-envs $ pip install -e ./ml-agents-release_8/ml-agents $ pip install -e ./ml-agents-release_8/gym-unity
上から順に
入れていきます。ちゃんとディレクトリ階層があっていればインストールが始まります。
時間がかかるので焦らずお茶を飲みましょう。$ pip listUnityのテスト環境構築
Unity Hubを開いてプロジェクト>リストに追加をクリック。
C:\Users\
ユーザー名
\ml-agents-release_8 内のProject
フォルダを選んで、フォルダーの選択。
Unityバージョンを2019.4.1f1
に変更後、プロジェクト名をクリックして起動。
プロジェクトのアップグレード
の確認をする。次に出てくるポップアップもYes
を選択。
インポートが終わるまでお茶でも飲みましょう。
次に、Assets>ML-Agents>Examples>3DBall>Scenesフォルダから3DBall.unity
をダブルクリックで実行します。
シーンが読み込まれたらUnity上部のPlayボタン
を押して、シーンを実行してみます。
(少し読み込みがあるので待ちましょう)
可愛いシーンが再生されましたね!
このシーンには頭の上に乗ったボールを落とさないように学習済みのデータが設定されています。
ではPlayをもう一度押しシーンを終了して、1から学習してみましょう。
(ml-agents) C:\Users\ユーザー名
> の状態で$ mlagents-learn ./ml-agents-release_8\config\ppo\3DBall.yaml --run-id=3DBall-1 --train色々出てきた最後に、
Start training by pressing the Play button in the Unity Editor.
と表示されたらUnityのPlayボタン
を押してください。
そうするとボックス君たちが微振動を始めるかと思います。それが世界のおわr学習の始まりです。
人によってはパソコンがブオーンと唸るかもしれませんが我慢です。(古いパソコンでさすがにヤバそうだったらPlayを停止するか、コマンドプロンプトでCtrl+Cを押して終了してください。)
しばらくはコマンドプロンプトとUnityを眺めててください。学習が終われば自動的に止まります。
コマンドプロンプトに表示されてくるMean Reward
が平均的な報酬ですので、これが高くなっていくようなら学習が順調に進んでます。学習が終わると色々コマンドプロンプトに表示されたあと、(ml-agents) C:\Users\
ユーザー名
> の状態に戻りますので、
C:\Users\ユーザー名
\results\3DBall-1ファイルを開きます。
3DBall.nn
というNN形式のファイルが先ほどの学習で手に入った学習済みデータ
です。(NNはニューラルネットワークの意(Neural Network))
UnityのProject内にドラッグアンドドロップで移して、右クリックRenameで3DBall-NN
と間違わないよう名前を変更します。
次にHierarchyから3DBallの右の矢印>
をクリックして、3DBallのPrefabを開きます。
するとPrefabの設定画面に移るのでSceneの背景が青色に代わるのを確認した後、HierarchyからAgent
を選択状態にすると、InspectorにBehavior Parameters
というコンポーネントがあります。
そこのModelに先ほど追加した学習済みのNNファイル
をドラッグアンドドロップ等で設定してください。
設定後Hierarchyの左上の小さな左矢印<
でPrefabの設定画面から抜けます。
Unity上部のPlayを押してシーンを再生すると、Hierarchy内の3DBallが割り当てた学習済みファイルになってるのが確認できるかと思います。(見た目上大きな変化はないかもしれませんが、先ほど学習したデータです)以上で学習のテストは終了です。
他にもデモシーンが用意されてるので学習時のシーンと.yamlの名前を変えながら試してみるとよいかと思います。まっさらなUnityのプロジェクト構築
番外編ですが、デモシーン無しのまっさらなML-Agents用の新規プロジェクトの作り方です。
メニューからWindow>Package Managerを開きます。
左上の+
ボタンを押してAdd package from disk
を選びます。
C:\Users\ユーザー名
\ml-agents-release_8 に移動してcom.unity.ml-agents
フォルダ内のpackage.json
を開きます。
インポートが終われば完了です。
- 投稿日:2020-10-19T15:04:35+09:00
[Mac]外部GPUを追加したが使われてなさそうだったときの対処法
https://www.amazon.co.jp/gp/product/B07CQG2K5K/背景
ちょっと前に外付けGPUを購入したのですが、GPU使う系の処理をしてもなんか早くなってない気がする、、、と思ったら、アプリケーション側で下記の設定が必要なケースだったようで、備忘録。
対処方法
以上です。
参考
https://support.apple.com/ja-jp/HT208544
※ というか下記にかいてるのをほぼそのまま書いてます
- 投稿日:2020-10-19T11:45:07+09:00
UnityでiOS向けにC系の関数を扱う
概要
UnityからC言語を使う為の備忘録です。
参考
https://docs.unity3d.com/ja/2018.4/Manual/NativePlugins.html
実装
名前空間
using System.Runtime.InteropServices;[DllImport("__Internal")] を使用するのに必要です。
属性
[DllImport("__Internal")]メソッドの上に書く。
サンプル
/// <summary> /// 初期化 /// </summary> [DllImport("__Internal")] static extern void InitializeiOS(string hogehoge);iOSでしか機能しないので「UNITY_IOS」などのシンボルを活用すると尚良い。
C
extern "C" { void InitializeiOS(char *hoge) { // 処理 } }stringはcharのポインタで。
設置方法
基本的には「Assets/Plugin/iOS/XXXXX.mm」としてファイル名をつけて保存する。
ビルドするとそのままXcodeプロジェクト内部に保存される。
- 投稿日:2020-10-19T10:15:31+09:00
Unity対応のマージツールを比較する
はじめに
チーム開発ではバージョン管理システム及びマージツールは必要不可欠です。
私は普段の開発ではVSCode+GitLensを使用することが多いのですが、Unity純正のバージョン管理システムであるUnity Collaborateを使って開発する機会ができたため、この機会にUnity対応のマージツールを探します。MacだとApple File Mergeがあるので、今回はWindows対応のものを探します。
前提
要件は、Unity側で対応していること、無料であること、Windowsで使えること。
用途はUnity Collaborateでのソースコードの比較です。(マージツールの説明についてはWikipediaを参照してください。)
比較対象
Windows版のUnityが対応している比較/マージツールは以下の7種。
- SourceGear DiffMerge
- TkDiff
- Araxis Merge
- TortoiseMerge
- WinMerge
- PlasticSCM Merge
- Beyond Compare 4
その中で無料で使用できるのは
- SourceGear DiffMerge
- TkDiff
- TortoiseMerge
- WinMerge
の4つでした。
(PlasticSCM Mergeはライセンスによって値段が変わり、個人、非営利団体、及びオープンソース開発には無料で用いることができますが、今回は外します)簡易比較
今回の結果の表です。簡易的に比較します。情報量の多さの参考としてGoogle検索結果の見積もり件数(2020/10/19現在)を載せました。
マージツール Google検索結果の見積り数 セットアップの大変さ Windows以外のOS 使用感(個人の意見) (SourceGear) DiffMerge 約 440,000 件 簡単 対応 シンプル TkDiff 約 77,700 件 大変 対応 (未使用) TortoiseMerge 約 30,300 件 やや大変 非対応 使いやすい WinMerge 約 501,000 件 簡単 非対応 まあまあよい 検証
実際使ってみます。
SourceGear DiffMerge
Mac OSやUbuntu等にも対応しています。
セットアップはホームページからダウンロードしてセットアップウィザードに従うだけなのでとても簡単です。UIは英語ですが、とてもシンプルなので問題には感じません。
機能としては
- 変更のある行ごとに「変更前のものを適用する」
- 「次の変更に飛ぶ」
- 「前の変更に飛ぶ」
- 「重要でない変更は隠す」(インデント等)
等があります。シンタックスハイライトはなさそうです。
シンプルさが好きでどのOSでも同じものが使いたいというのであればこれを使うのが良いように感じました。TkDiff
すみません、数時間粘りましたがUnityに認識させることができませんでした。
TkDiffはTcl/Tk環境が必要です。WindowsではTcl/Tk環境がないため、環境構築から始める必要があります。
Tcl/Tk(ティクル・ティーケー)は、スクリプト言語 Tcl と、その GUIツールキット Tk を指す。(Wikipedia引用)
環境構築はActiveTclをダウンロードするか、SourceForgeからソースコードをダウンロードしてコンパイルするなどの方法があります。コンパイル方法については以下のQiitaの記事が参考になります。
Visual Studio 2017でTcl/Tk 8.6.9をコンパイルする次にTkDiffのダウンロード。
セットアップウィザードはありません。zipファイルをダウンロードして、展開して、ファイル名に拡張子を追加して(tkdiff → tkdiff.tcl)PATHを通したところまでやったのですが、Unityが上手く認識してくれずに断念しました。
Windows以外ならばうまく動くのかもしれません。TortoiseMerge
Windows専用。
TortoiseSVNという、バージョン管理システム(SVN)のクライアントアプリケーションに付随するソフトで、つまりTortoiseSVNをダウンロードする必要があるっぽいです。余分なものがついてくるので嫌な人は注意。また、日本語化するには追加で日本語化パックをインストールして設定をする必要があります。
これ単体ではググったとき日本語の情報が少ないです。変更点、追加点が分かりやすく、機能も画像をパッと見て分かる通り豊富です。
UIは4つの中で最も優れているように感じました。簡単に使えます。WinMerge
Windows専用。日本語の情報が4つの中で最も多いように思えます。
セットアップも簡単です。※注意:WinMergeは64bit版だとUnity側で認識されなさそうなので注意。Unityで利用する場合は32bit版をダウンロードするようにしてください。
UIはTortoiseMergeには劣りますが(個人の感想です)使い辛いというほどではなく、機能も豊富です。
結論(個人の意見です)
どのOSでも同じものを使いたい or シンプルイズザベスト
→SourceGear DiffMergeUI命
→ TortoiseMerge無難に、普通に、楽に使いたい or 日本語の情報が多いものがいい
→ WinMerge 32bit版