ぱふの自由帳

週3更新(火・木・日)を目指すUnityブログ。良ければフォローお願いします(`・ω・´)

【Unity】ベクトルを正規化する

はじめに

ベクトルの正規化を行う方法の紹介です。

正規化?

ベクトルを正規化すると単位ベクトル(長さが1のベクトル)になります。
詳しくはグーグル先生に。とても分かりやすく教えてくれますよ。笑

やり方

Vector3.normalized

Vector3.normalizedで正規化されたベクトルを取得できます。

Vector3 v = new Vector3(1, 2, 3);
Vector3 vn = v.normalized;
// vnは"vと同じ向き&長さが1"のベクトルになっている

Vector3.Normalize()

Vector3.normalizedに似ていますが、若干違います。
Vector3.Normalize()は元のベクトルを変更する時に使用します。

Vector3 v = new Vector3(1, 2, 3);
v.Normalize();
// vが"向きはそのまま&長さが1"のベクトルになる

おわり

しっかり使い分けましょー。

【C#】Listの一部をListとしてコピーする方法

はじめに

Listの一部をListとして取り出す方法についてです。

Listの一部をListとして取り出すというのは、こんな感じの操作です↓

List<int> list1 = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

/*
 list1の[3]~[6]部分が欲しい
 List<int> list2 = {3, 4, 5, 6} のようなList
*/

方法

GetRange(int index, int count)を使用します。

それぞれの引数についての解説

  • 第一引数は切り取り部分のスタートとなるindex番号

  • 第二引数は切り取りたい個数

以上を踏まえて”はじめに”で挙げた例をコードに直したいと思います。

List<int> list1 = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> list2 = list1.GetRange (3, 4);

// list2 -> {3, 4, 5, 6} となる

おわり

簡単ですねー。
同じことを配列でやろうとすると...Copyという関数を使うのが手っ取り早いのかな?

気になる方はググってみてくださーい!

Sourcetreeの使い方入門!《2018年2月更新》

はじめに

Sourcetreeの基本的な使い方を調べたものをまとめた記事です。
執筆時点で私も初心者同然なので詳しい領域には踏み込めないと思いますが良ければ参考にしてください!

あ。ちなみにMacでやっているのでWindowsの方とは違う箇所があるかもしれません...。

事前準備

  • Gitの初歩的な知識(Git管理のプロジェクトが作れる/Gitの基礎用語が理解できる程度でOKです)

  • GitHubリポジトリを作成

Sourcetreeって?

GitをGUIで操作できるツールらしい。
コマンドでGit管理?アレ面倒だよな?って方に適しているかも。

SourceTreeのインストール

Sourcetree公式でダウンロードして下さい。

f:id:PafuOfDuck:20180205223904p:plain

試用版や無料版とかありますがそこら辺の説明は他のサイトに丸投げ...お任せします。

基本機能を使ってみる

目次

  • Githubアカウントの登録
  • リポジトリを登録
  • ファイルの変更点を確認
  • add
  • commit
  • push

Githubアカウントの登録

ここで解説するのはGithubへの登録方法ではありません。笑
SourcetreeにGithubアカウントを登録する方法です。

Sourcetree > 環境設定 > アカウントという操作を行うと追加ボタンが表示されているはずなので、それをクリックします。するとウィンドウが表示されるので以下のように設定して下さい。(ユーザー名はGithubのアカウント名、パスワードはGithubのパスワードを入力して下さい。)

f:id:PafuOfDuck:20180207031527p:plain

するとアカウントの登録が完了するはずです。
キーチェーンの確認が出た場合は許可常に許可してあげましょう。

リポジトリの登録

  1. GithubClone or downloadからURLをコピーしておく
    f:id:PafuOfDuck:20180207015737p:plain

  2. Sourcetreeのファイル > 新規を選択
    f:id:PafuOfDuck:20180207015800p:plain

  3. 開かれるウィンドウの新規 > URLからクローンを選択
    f:id:PafuOfDuck:20180207020019p:plain

  4. ソースURLにコピーしたURLを入力&保存先パスと名前を入力
    f:id:PafuOfDuck:20180207020237p:plain
    この時、適当なフォルダを指定していないとフォルダの中身を空に〜といったエラー文が表示されることがあります。指示通り中身を削除するか、新しくフォルダを作成することで回避しましょう。(オススメは圧倒的に後者です。)

    また、名前はSourcetree内での管理名だと思います。(もしかすると他でも使われているのかもしれません。フォルダ名と同じにしていれば特に問題ないと思います。)

ファイルの変更点を確認

ファイルの変更点の確認方法は超簡単です!
まず、サイドバーにあるファイルステータスを選択します。

f:id:PafuOfDuck:20180207022858p:plain

すると下の画像のように変更点が右のウィンドウに表示されます。

f:id:PafuOfDuck:20180207022905p:plain

add

まずはaddの方法からです。

サイドバーにあるファイルステータスを選択します。その後、以下の操作を行うことでaddされます。

addされたかを視覚的に確認したい方は、以下の画像の赤枠をクリック > ステージビューを分割するを選択すると良いです。

f:id:PafuOfDuck:20180207023552p:plain

commit

addが完了したら次はcommitです。

サイドバーにあるファイルステータスを選択します。その後、下部に画像のようなウィンドウがあるのでコミットメッセージを入力後にコミットボタンを押すだけです。
もし、そのようなウィンドウが無ければ上部のコミットボタンを押して下さい。

f:id:PafuOfDuck:20180207024608p:plain

これでcommitが完了します。

push

最後にpushを行ってリモートリポジトリに反映させましょう。

上部にブッシュボタンがあるのでクリックします。すると、以下のようなウィンドウが開くので、pushしたいブランチを選択してOKを押しましょう。(今回は新規にブランチを作ってないのでmasterのみになっています。)

f:id:PafuOfDuck:20180207032208p:plain

push中にエラーが出なければpush完了です。なお、pushが終了しない場合は詳細情報を表示してみて下さい。エラーが発生している場合があります。

"Error generating password due to missing uuid. Please report this to Atlassian."というエラーが表示されている場合

アカウント設定を行なっていないか、アカウントを複数設定していて違うアカウントを指定している可能性があります。アカウント設定を見直して下さい。

最後に

現在、紹介しているのはほんの一部の機能(のはず)です。なので、私が触れた機能を随時更新して"使い方辞典"っぽくしていく予定です。

「この機能の使い方追加して。」や「誤字あるよ。情報古いよ。」などのコメント歓迎しております〜。

【Unity ML-Agents】Unity-Agents-Overview.mdを日本語でまとめておく

はじめに

未来の自分用の備忘録記事です。

英語がとーーーーっても苦手で何度も訳すのはストレスで死んじゃいそうなので、、簡単にですが日本語に翻訳&まとめておきます。

英語が苦手+自分用に簡略化しているので、間違っている箇所や分かりづらい箇所もあると思います。是非ご指摘いただけると嬉しいです!

以下、翻訳&まとめ

Learning Environments Overview

上の画像(画像は省略)はML-Agents内で学習環境がどのように構築されているかを視覚的示したものである。

Agents学習環境内の主要な3種類のオブジェクトは次のようになっています。

  • Agent - 各エージェントは状態と観測の独自のセットを持ち、環境内で独自の行動を取ることが出来る。さらに環境内のイベントに対して独自の報酬を得ることが出来る。エージェントの行動は結合しているブレインによって決定される。

  • Brain - 各ブレインは特定の状態と行動空間を明確にし、ブレインと結合しているエージェントが取る行動を決定する責任がある。ブレインは次の4つのモードのいずれかに設定できる。

    • External - Python APIを用いたオープンソケットを介して通信することにより、TensorFlow(または、あなたが選んだMLライブラリ)を使用してアクションの決定が行われる。
    • Internal(Experimental) - TensorFlowSharpを介してプロジェクトに埋め込まれた訓練済みモデルを使用してアクションの決定が行われる。
    • Player - アクションの決定はプレイヤーの入力を使用する。
    • Heuristic - アクションの決定は手動で記述したコードを使用する。
  • Academy - シーン内のAcademyオブジェクトは、環境内のすべての脳を子供として含むことも出来る。各環境には、次のような環境の範囲を定義する単一のアカデミーが含まれている。

    • Engine Configuration(エンジンの構成) - トレーニングと推論モード内でのゲームエンジンのスピードとレンダリング品質。
    • Frameskip(フレームスキップ) - 新たな決定を行う各エージェント間をスキップするためのエンジンステップの数。
    • Global episode length - エピソードがどれぐらい続くか。結果に達すると全てのエージェントはdone(行動済み)がセットされる。

外部に設定されたブレインを持つ全てのエージェントの状態と観察は、外部コミュニケータによって収集され、Python APIを介して通信される。ニューラルネットワーク特有の並列計算方法のように、複数のエージェントを1つの脳に設定することで、アクションをバッチ式で決定できる。これらのオブジェクトがシーン内でどのように連動するかの詳細については、我々のwikiページを参照すること。

Flexible Training Scenarios

Unity ML-Agentでは、エージェント、ブレイン、報酬をどのように接続するか次第でさまざまな種類のトレーニングシナリオが可能である。私たちは、コミュニティがどのような革新的で楽しい環境を作り出しているかを見て楽しんでいる。優秀なエージェントを訓練する人のために、インスピレーションになりそうないくつかの例がある。これらの例は、ML-Agents SDKを使用してどのように作成できるかという説明を含んだ典型的な環境構築方法です。

  • Single-Agent - 1つの脳に結び付けられた1つのエージェント。エージェントを訓練する伝統的な方法。チキン(という名前のゲーム)のようなシングルプレイヤーゲームがこれにあたる。(ビデオリンクは省略)

  • Simultaneous Single-Agent - 1つの脳に結び付けられている独立報酬機能を持つ複数の独立エージェント。伝統的な訓練を並列化したもので、訓練のスピードアップと安定化が可能。十数個のロボットアームを訓練してドアを同時に開けるといった訓練がこれにあたる。(ビデオリンクは省略)

  • Adversarial Self-Play - 逆報酬関数を持ち、互いに影響し合うエージェントが1つの脳に結び付けられている。2人プレイのゲームでは、セルフプレイによって完全な敵と常に戦うことで、エージェントがどんどん熟練していく。これはAlphaGoを訓練する際に利用した方法であり、最近ではDota2の1v1で人間を打ち負かす訓練にも利用された。(デモプロジェクトは近日公開)

  • Cooperative Multi-Agent - 共有報酬機能を持ち、互いに影響し合う複数のエージェントが 1つまたは複数の異なる脳に結び付けられている。全てのエージェントは目標を達成するために単独ではなく、共に作業を行わなくてはならない。例としては、各エージェントが部分的な情報にしかアクセスできない環境があり、その部分的な情報がタスクを達成するために共有する必要があるといったもので、共同でパズルを完成させるといったタスクが具体例である。(デモプロジェクトは近日公開)

  • Competitive Multi-Agent - 逆報酬機能を持ち、互いに影響し合う複数のエージェントが1つまたは複数の異なる脳に結び付けられている。戦いに勝つ、または限られた数のリソースを獲得するために、互いに競争しなければならない。全てのチームスポーツはこれに該当する。(デモプロジェクトは近日公開)

  • Ecosystem - 独立した報酬機能を持ち、互いに影響し合う複数のエージェントが1つまたは複数の異なる脳に結び付けられている。これは、シマウマ、ゾウ、キリンなどのサバンナや都市環境内での自律的な運転シミュレーションなど、さまざまな目標を持つ動物が相互に作用する小さな世界を創造するものと考えることができます。(デモプロジェクトは近日公開)

Additional Features

ML-Agentsには、Academy / Brain / Agentシステムで可能となる柔軟なトレーニングシナリオ以外に、トレーニングプロセスの柔軟性と理解のしやすさを向上させるその他の機能も含まれている。

  • Monitoring Agent’s Decision Making - ML-Agentsでの通信は双方向なので、Unity環境内でのポリシーや値の出力など、訓練されたエージェントの側面を表示できるUnityのAgent Monitorクラスを提供している。これらの出力をリアルタイムで提供することで、研究者や開発者はエージェントの行動をより簡単にデバッグできる。

  • Curriculum Learning - エージェントが初期の訓練で複雑なタスクを習得することが困難な場合がしばしばある。カリキュラム学習(Curriculum Learning)はタスクの難易度を徐々に増加させることでより効率的な学習を可能にしている。ML-Agentsは、環境がリセットされるたびにカスタム環境パラメータのセッティングをサポートする。これにより、難易度または複雑さに関連する環境の要素を、トレーニングの進捗状況に基づいて動的に調整することができる。

  • Complex Visual Observations - エージェントの観察が1つのベクトルまたは画像に限定される可能性がある他のプラットフォームとは異なり、ML-Agentsでは複数のカメラをエージェントごとの観測に使用できる。これにより、異なる視点の複数のカメラを必要とする自走車、航空写真および一人称視点を統合する必要があるナビゲーションエージェント、または、視点の異なる複数のカメラを訓練する場合のように、エージェントは複数のビジュアルストリームから情報を統合することを学ぶことができる。また、エージェントは深度マップやオブジェクトをセグメント化した画像はもちろん、未熟な視覚入力のどちらも受け取れる。

  • Imitation Learning (Coming Soon) - たいていは、試行錯誤で学習を試みるよりも、エージェントに実行して欲しい行動をデモンストレーションする方が直感的である。将来のリリースでは、ML-Agentsは、模倣学習といった教師あり学習シナリオで使用するために、すべての状態/行動/報酬情報を記録する機能を提供する。模倣学習を利用することで、プレイヤーはエージェントが環境内でどのように行動すべきかのデモンストレーションを行い、そのデモンストレーションを利用してスタンドアロン式でエージェントを訓練したり、強化学習プロセスの第一歩として活用することができる。

疑問点

  • 逆報酬機能ってなんだろうか。勝てば+負ければ-の報酬を与える機能って意味で良いのかな。(AlphaGoと同じと書いてあるし...)

さいごに

意味がイマイチわからない部分もありますが、最後まで日本語に出来ました!
誤訳があると思うので、見つけた方はコメントかTwitterで教えて下さい。( ´∀`)

個人的に気になるのは最後のImitation Learningですね。実装されれば、「△△という挙動をさせたいから〇〇すると報酬を与えるようにする。」とやっていたものを「こういう感じでやってね。(実演)」と出来るようになるのでしょうか...?
出来たとしたら便利ですよね〜。

他にも英語チュートリアルはありますので適宜翻訳していきたいと思います。(私以外に需要があるか知りませんが...笑)
「英語得意だから翻訳やってやんよ」という神の出現お待ちしております〜〜!

【Unity2017.1】Materialのパラメータを動的に弄りたい...でもパラメータ名がわからない!そんな時

はじめに

タイトルだけでは分かりづらいかと思うので、画像をペタッと。

f:id:PafuOfDuck:20180131195733p:plain

赤枠の箇所の色変更したいけど、スクリプト内で指定するための正式名称がわからない!という方向けの記事です。

とても短いので困っている方はサラっと読んで見てください〜。

名称の確認方法

右上の歯車のとことろをポチッと押すと下の画像のような項目が出てくるのでSelect Shaderをクリックします。

f:id:PafuOfDuck:20180131200037p:plain

すると...どーーーーん。

f:id:PafuOfDuck:20180131200151p:plain

以上です。(笑)
左が名前、右がクラス名ですね。

おわり

完全に手抜き記事ですが、意外とハマることなのでこの機会に覚えてしまいましょ〜^^

【Unity2017.1】オブジェクトの角度を取得する

はじめに

オブジェクトの角度を取得するぞー!
transform.rotationはダメ...
transform.localRotationにしてももちろんダメ...

あれ?どうやって取得するんだ?って方への記事となっています。

取得方法

以下の方法で取得できます。(上からワールド / ローカルの順)

  • transform.eulerAngles
  • transform.localEulerAngles

おわり

「じゃあtransform.rotation.xってなにしてるの?」って疑問が生じると思います。
Unityは回転を表現するのにクォータニオンという数学の考え方を用いているので、それを取得してくれているのです。その証拠に、Debug.Logで値を表示してみると...値が4つ入っているのが確認できるかと!

【Unity2017.1】子オブジェクトを全て削除する方法

はじめに

子オブジェクトを全て削除した時に、結構な頻度で子オブジェクトの取得方法からググっているのでコードをコピペできるようにメモ。

取得→削除

以下のコードで実装できます。

foreach(Transform child in gameObject.transform){
    Destroy(child.gameObject);
}

おわりに

自分用のメモでした〜。使う方はガンガンコピってください。b

DoTweenで無限ループが実行されない!そんな時に確認すべきこと

はじめに

DoTweenでSetLoops(-1)と書くと無限ループになると思います。ですが、無限ループが実行されずにエラーも出ないという状況になる場合があります。

というわけで、早速その場合について見ていきましょう。

無限ループが実行されるコード

まず、無限ループが実行される場合について見ておきましょう。
以下のようなコードでは無限ループが正常に動きます。

gameObject.transform.DOMove (new vector3(1f, 1f, 1f), 1f)
.SetLoops (-1);

無限ループが実行されないコード

では、無限ループが実行されない場合について見てみましょう。

Sequence seq = DOTween.Sequence();
        seq.Append(
            gameObject.transform.DOMove(new vector3(1f, 1f, 1f), 1f)
            .SetLoops(-1)
        );

何がダメなのか

コードが明らかに違うので分かりやすいかもしれませんが、Sequence内では無限ループは実行されません。なので、Sequence外で無限ループを実行してあげれば解決します。

おわりに

実は公式ドキュメントに書いてある内容です。笑
私は英語がてんでダメなのでハマってしまいました...なので、同じように英語が苦手な方の助けになれば幸いです!

参考:公式で言及している部分のスクショ↓↓
f:id:PafuOfDuck:20180121174623p:plain

【Unity2017.1】Bloomエフェクトをかける方法

はじめに

まず、Bloomとはなんじゃという話ですが...
Blooming (ブルーム)とは明るい光源(例えば、閃光のような)からの光が周囲の物体に漏れるように見える光学効果のことです。

論より証拠ということで画像をペタっと貼っておきます。

  • Bloomなし
    f:id:PafuOfDuck:20180116154545p:plain

  • Bloomあり
    f:id:PafuOfDuck:20180116154548p:plain

とても簡単に実装できるので早速やっていきましょー!

実装

Post Processing Stackの準備

以下のアセットをインポートしてください。

Post Processing Stackの設定

  1. ProjectウィンドウからCreate > Post-Processing Profileを選択してPost-Processing Profileを作成する
    f:id:PafuOfDuck:20180116161002p:plain
  2. MainCameraPost Processing Behaviorをアタッチ
    f:id:PafuOfDuck:20180116161056p:plain
  3. Post Processing BehaviorProfileに1で作成したものをアタッチ
    f:id:PafuOfDuck:20180116161029p:plain
  4. Post-Processing ProfileのBloomを有効化する
    f:id:PafuOfDuck:20180116160826p:plain
  5. 完成
    f:id:PafuOfDuck:20180116161148p:plain

おわりに

Assets > Import Package > EffectでImportされるStandard Assets内にあるBloomエフェクトを使用する方法が古い記事で見かけます...ですが、現在Standard Assets内にBloomエフェクトが存在しないためうまくいきません。
なので、この方法が簡単なのではないかなと思っています。

より簡単な方法がありましたらコメント等でご教授ください><。

【unity2017.1】emissionで3Dオブジェクトを光らせる

はじめに

今回は静的な3Dオブジェクトを光らせ、静的な3Dオブジェクトに影響を与える方法についてです。動的な3Dオブジェクトには使えませんのでご注意を!

実装

  1. Materialを新規に作成します。
  2. 光らせたいオブジェクトに作成したMaterialをアタッチします。
  3. materialの設定からemssionを有効化します。
    f:id:PafuOfDuck:20180116153207p:plain
  4. 光らせたいオブジェクトと光の影響を受けたいオブジェクトをどちらもstaticにします。
    f:id:PafuOfDuck:20180116153247p:plain
  5. 光ります。
    f:id:PafuOfDuck:20180116153304p:plain

おわりに

光る側も光を受ける側もstaticにするというのを忘れずに...((ハマりました!

また、2Dの光らせ方は後々記事に直すと思いますので気になる方は確認してみてください。