ぱふの自由帳

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

【Unity2017.1】親オブジェクトの回転を無視したい!

はじめに

”親オブジェクトは回転させたいんだけど子オブジェクトは回転させたくない!”という方向けの記事です。

意外なことに、この方法の紹介記事が見当たらなかったので記事にしましたー。選択肢の一つとしてどうぞ!

Quaternion.Eulerを直接代入しよう!

子オブジェクトに以下のスクリプトをアタッチしてみましょう。

void Update(){
    gameObject.transform.rotation = Quaternion.Euler(x, y, z);
}

これで子オブジェクトの回転が親オブジェクトの回転に関係なく固定されるはずです。

注意:(x, y, z)にはWorld座標から見たオブジェクトのRotationを代入してください。 『World座標から見た』という意味が分からない方は、親オブジェクトを持たない状態でのRotationの値と考えてもらえれば良いです。

注意点?

gameObject.transform.rotationgameObject.transform.localRotationにしないようにしましょう。

おわり

一番最初に思いつきそうな単純な方法なのですが、なぜ記事がなかったのか...ぐぐーる力が無いのでしょうか...(。´・ω・`)

【Android】アプリのインストール時に発生する「このアプリはインストールされていません」というエラーの解決法

はじめに

Unityの実機デバッグ時にAndroidで.apkファイルを開いてインストールしようとするとこのアプリはインストールされていませんというエラーが出てしまう...。
そんな時に役立つ(かもしれない)記事です。

おそらくUnity以外で生成した.apkでも大丈夫です。

解消法

  • 設定 > アプリケーションからアプリがインストールされているか確認して、インストールされていればアンインストールしてください。

  • 設定 > アプリケーションからアプリがインストールされているか確認して、すべてのユーザーからアンインストールを選択して全てのユーザーからアンインストールをしてください。

私は2つ目の方法が必要な状況に遭遇したことないのですが、ネットで見つけたので参考に記述しておきました〜。

おわり

単純なことなのですが、このエラーに出会った時は「なんやこれ?!」ってなったので記事に直しましたー。

記事とは関係ないのですが、スマホにマルチユーザー機能とかあるのですねー。こういうテストもしなければならないのでしょうか..(´・ω・`。)メッチャタイヘン

【Xcode】”〜のiPhone is busy: Preparing debugger support for 〜のiPhone”というエラーを解消出来るかもしれない方法

はじめに

〜のiPhone is busy: Preparing debugger support for 〜のiPhoneというエラーに困っていませんか?
今回はこのエラーを解消できるかもしれない方法のメモです。

解消法紹介

以下の方法のどれかで解決するはずです。
解消しない場合はいくつか試してみてください。

※数字が小さいほど(個人的に)直る確率が高いものです

  1. PC上でiTunesが開いていれば閉じる
  2. iphoneを再起動
  3. Xcodeを再起動
  4. iphoneXcodeに接続し直す
    Window > Devices and Simulatorsを開いてUnpair Deviceを実行して登録を解除した後、再度登録し直します。

    f:id:PafuOfDuck:20180308231248p:plain

    f:id:PafuOfDuck:20180308231252p:plain

おわり

基本はiphone再起動+Xcode再起動で直る気がしますー!

「他の方法で解決したよ!」という方がいれば情報をいただけると嬉しいです〜。

switch文のスコープのお話

はじめに

ふとした時に役立つswitch文のスコープについての話です。

switch文のスコープ

違いが分かりますか?

2種類のswitch文を使用したコードを載せます。
違いを答えることが出来ますか?

switch(hoge){
  case 0:
    int i = 2;
    break;

  case 1:
    int i = 4;
    break;
}
switch(hoge){
  case 0:
    {
      int i = 2;
      break;
    }

  case 1:
    {
      int i = 4;
      break;
    }
}

違いを解説

1つ目のコードは動きませんが、2つ目は問題なく動きます。
原因は...そう!記事のタイトルにもあるようにスコープです。

switch文のスコープはデフォルトのままだとswitch文全体に及びます。すなわち、case 0内で宣言した変数をcase 1内でも使用できるのです。なので、1つ目のコードは同じ変数名で宣言をしているとみなされて動かなかったんですね。
しかし、case内で{}を用いると...{}内部にのみ適応されるスコープが出来上がります。そのため、2つ目のコードは問題なく動いたのです。

おわり

switch文の内部で凝った実装をするとスコープが邪魔をしてきます。
「実装方法に問題がある!」と言われてしまえばそれまでですが、変数のスコープで困った場合は{}で解決しちゃいましょう!

追記:{}で囲むとswitch文に限らず新たなスコープを作成できるようです。指摘してくれた方、ありがとうございます! ((((一回も使ったことなくて知らなかった...

【Unity】2点間の距離を求めるいくつかの方法

はじめに

2点間の距離を求める方法がいくつかあるので紹介したいと思います!
是非、自分好みの方法を探してみて下さい〜。

方法紹介

その1:三平方の定理

三平方の定理の詳細は解説サイトにお任せします。

直角三角形の斜辺をC, その他の辺をAとBとすると、
A^2 + B^2 = C^2 ってなるやつですね。


コードはこちらになります。

Vector2 posA = new Vector2(1f, 2f);
Vector2 posB = new Vector2(3f, 4f);

float distance = Mathf.Sqrt(Mathf.Pow(posA.x - posB.x, 2) + Mathf.Pow (posA.y - posB.y, 2));
  • Mathf.Pow()は累乗を行う関数

  • Mathf.Sqrt()は与えた数を平方根に直す関数

その2:magnitude

magnitudeはベクトルの長さを返してくれます。
そのため、最初に2点の引き算を行うことでベクトルに変換して使用します。

Vector2 posA = new Vector2(1f, 2f);
Vector2 posB = new Vector2(3f, 4f);

float distance = (posA - posB).magnitude;

その3:Distance()

Distance()は2点を与えると2点間の距離を返してくれます。

Vector2 posA = new Vector2(1f, 2f);
Vector2 posB = new Vector2(3f, 4f);

float distance = Vector2.Distance(posA, posB);

さいごに

個人的にはその3が好きですね〜。
距離っていう名前の関数名なので後から見ても分かりやすいですし!

好きな方法を模索してみて下さい!では〜。

【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

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

おわり

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