2016年1月25日月曜日

[UE4]AIControllerを設定したはずなのにGetController()でNullが返ってくる件について

おっす。久しぶりだ。siroponnだ。

皆さんは、UE4を使っていますか?僕は仕事で使っています。
そこで投稿タイトルのような事が起きたので、メモしておこうと思う。

先日。オリジナルのAIControllerを作り、ブループリントのPawnカテゴリーのAIControllerクラス を設定するプロパティにそのオリジナルのAIControllerを設定した。

その後、this->GetController()とかやったら、なぜかNullが返ってきた。設定しているのになぜ!

何十時間も悩んだ末、一つのプロパティを見つけた。

同じブループリントのPawnカテゴリーのAuto possesというプロパティを見てほしい。
値が、SpawnかPlace in Worldになっていないだろうか?
そうだ。もう気づいてると思うが、Spawnの時はスポーン時しか、Place in worldの時は直接レベルに配置した時しかAIControllerは設定されない。
もうひとつ値があり、Spawn or Place in worldという値がある。こいつを設定して初めて、両方の時に対応する。
クソだ。なんでこんなややこしい設定になっているんだ。

こんなところで、何十時間もかかってしまった。僕は一生UE4を許さん。

てな訳でSiroponnでした。みなさんは気を付けてくださいね。

2015年3月24日火曜日

PhotonNetworkのOnJoinedLobbyが呼ばれた瞬間はルームリストを取れない

おっすSiroponnです。
内容は件名のとおりです。
ルームリストが取れません。

以下のようにすぐにとろうとすると、0が表示されてしまいます。

/// <summary>
    /// ロビーに入ったらルームを作り、ルームに入る.
    /// すでにルームが作られていたらそれに入る.
    /// </summary>
    void OnJoinedLobby()
    {
        RoomInfo[] r = PhotonNetwork.GetRoomList();

        int count = r.Length;

        Debug.Log(count); //0が出る
    }

これを回避するには1フレ待ってあげるか。

//----------------

/// <summary>
    /// ロビーに入ったらルームを作り、ルームに入る.
    /// すでにルームが作られていたらそれに入る.
    /// </summary>
    IEnumerator OnJoinedLobby()
    {

        yierd return null;
        RoomInfo[] r = PhotonNetwork.GetRoomList();

        int count = r.Length;

        Debug.Log(count); //0が出る
    }

 //-----------------------------

下の用にループ上で調べるのがよさそうです。

//---------------------


/// <summary>
    /// ロビーに入ったらルームを作り、ルームに入る.
    /// すでにルームが作られていたらそれに入る.
    /// </summary>
    void  OnJoinedLobby()
    {
       debugPhaze = 1;
    }


void Update()
{
     switch(debugPhaze)
     {
          case 0:
           break;
          case 1:
              //ルームを調べたりする処理.
           break
     }
}

 //---------------------------

他に方法があるかもしれません。僕ちんは先ほど気づいたのでこの方法しかまだわかりません。


では、siroponnでした







2015年2月14日土曜日

MacPortsを使ってApache2.4とphp5.6.5を入れた件について

siroponnです。

今回はMacPortsでApache2.4とphp5.6.5を入れたことについて書いていこうかと思います。
僕自身素人でしかもweb系のものをからっきしなので、間違っているかもしれません。
実際僕もフリーランスの先輩にいくつか教えてもらいました。

じゃあまずMacPortsを入れましょう。ここは他のサイトを当たってください。

次にMacにデフォルトで入ってるApache2.2を無効化してしまいましょう。
Apache2.4を使おうが、Apache2.2を使おうがMacPortsを使う以上、こいつは邪魔です。
以下のコマンドを打ちます。
$sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist

次に、Apache2.4をportコマンドで入れます。おそらくApache2.4-develみたいな名前であると思います。

インストールが終わったら、Apache2.4のhttpd.plistのシンボリックリンクをLaunchDaemonsにはりましょう。

$cd /System/Library/LaunchDaemons

$sudo ln -s /opt/local/etc/LaunchDaemons/org.macports.apache24-devel org.macports.apache24-devel

Apache2.4のインストールが終わったら起動確認しましょう。
こちらは手順を覚えていないのでもしかしたら起動できないかも。

$sudo apachectl start

起動できましたか?起動できたら以下のコマンドでindex.htmlファイルを編集します。
vimの使い方は検索してください。

$sudo vi /opt/local/www/apache2/html/index.html

it works!ってなっている部分をit24worksに変えましょう。
その後、apache2.4の設定ファイルをいじります。

/opt/local/etc/apache2以下にapache.org.confみたいなファイルがあるのでそれをhttpd.confとしてコピーします。httpd.confファイルがあればこれはしなくていいです。
httpd.confを作ったらそれを開きます。
Listen 12.34.56.78:80と書いてある部分を見つけます。
そこを#でコメント化し、その一行したにListen 80と記述します。
次にServerName www.examlpe.com:80と書いてある部分を見つけてください。
見つけたらそこをコメント化してください。
一行下にServerName localhost:80と記述します。
これでひとまずhttpd.confファイルの設定は終了です。保存してviを抜けましょう。

$sudo apachectl restart

でhttpdファイルを再読み込みします。

何にもエラーが出なければブラウザのURL欄にlocalhostと入力してください。

it24worksと出たでしょうか?できたらとりあえずapache24はインストールできました。

次はphpのインストールになります。

$sudo port search php56と打つと色々出てきますが、とりあえず生のphpを入れましょう。

$sudo port install php56

実行するとphp56がインストールされます。

ここで注意して欲しいのがapache2.2も同時に依存パッケージとして入ってるくることです。設定さえしなければ大丈夫なのですが、/opt/local/にapache2という項目が入っています。めんどくさいのでそのまま放置しておきますが、今後間違えないようにしてください。

さて入ってきたら

$cd /opt/local/etc/php56

$sudo cp php.ini-development php.ini

としてphp.iniファイルを複製しておきます。今後php.iniファイルをいじるときはこの複製したファイルをいじります。

$sudo port select php php56

でphp56を使うとしておきます。

次はphp-fpmです。

$sudo port install php56-fpm

で、php-fpmをインストールします。

インストールが終わったら.confファイル作れよバーカって書いてあるので(バーカとは書いていない).confを作ります。

$sudo cp /opt/local/etc/php56/php-fpm.conf.default /opt/local/etc/php56/etc/php-fpm.conf

さて、.confファイルが作り終わったら、php-fpmを起動させます。

$sudo port load php56-fpm

これでphp56-fpmを使う準備はできました。

次はまた、apache2.4の設定に戻ります。httpd.confファイルを開いてください。

開いたら、Include etc/apache2/extra/httpd-vhosts.confという部分がコメント化されているのでそこのコメントを削除します。

保存してviを抜けます。

その後以下のコマンドを打ちます。
$sudo vi /opt/local/etc/apache2/extra/httpd-vhosts.conf
これはヴァーチャルホストという機能を使うための設定ファイルです。詳しくは各自調べてください。

すでにある記述を軒並みコメント化します。コメント化してあればいいです。おらおらおら。

そのファイルの一番下に以下を記述します。
<VirtualHost *:80>
    DocumentRoot "/opt/local/www/apache2/html2"
    ServerName localhost3
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/(DirectoryRoot)/$1
    <Directory "/opt/local/www/apache2/html2">
    Require all granted
   </Directory>
</VirtualHost>

これで保存します。DocumentRootは貴方が自由に決める部分です

今回はテスト用なので自分で勝手に決めた、virtualhost用のdirを作ります。

$sudo mkdir /opt/local/www/apache2/html2

作成したdirにviでindex.phpを作ります。
そのファイルにphpinfo()を記述します。詳しくはphpのサイトを見てください。

終わったら
$sudo apachectl restart
を実行して設定ファイルを反映します。

ブラウザのURL欄にlocalhost3をうって実行。

phpの設定が出ましたか?
出たなら成功です。
ですが、出ない場合もあるかもしれません。僕は出ませんでした。

/etc以下のhostsファイルを開いてください。

127.0.0.1    localhost
255.255.255.255    broadcasthost
::1    localhost

が記述されています。この127.0.0.1 localhostの下に
127.0.0.1    localhost3を書きます。

ファイルを保存して閉じます。

一応apachectl restartします。

ブラウザでlocalhost3を再び入力します。

今度こそphpの設定が出ると思います。

以上で終了です。かなり雑多でかけ足に記述しました。


以下がまとめです。

・Macportsで必要なものをぶっこむ。
・各種設定をする。
・virtualHost使用時にhostsファイルにIPアドレスとサーバネームを記述する。
・起動!

ですね。

php-fpmを入れる部分はフリーランスの方に教えていただいた方法です。apache2.4の方にphp用のmodが入っていないので悩んでいたところ教えてもらいました。

では、また!









2015年1月9日金曜日

今年の抱負的なもの

明けましておめでとうございます、siroponnです。

今回は技術的な話ではありません。
普通のブログです。
新年も明けましたし、何か抱負的なものをと。
皆様は何か抱負を決めましたか?
僕は決めています。駆逐艦だけで2-4クリアです。

嘘です。

いや本当なんですけど。
真面目なものはどうしようかと考えています。
とりあえずやるべきことを列挙してみます。

unityで何本かゲームを作る。
unityEditorの拡張。
C#のLInq,ラムダ式,デリゲート辺りの勉強。
PhotonCloudの勉強。
C++の勉強。
directXの勉強。
OpenGL(ES含む)の勉強。
WebGLの勉強。
JavaScript,PHP,HTML(5),CSS(3) の勉強。
AIの勉強。
数学の勉強。
モデリングの勉強。
モーションの勉強。
2Dイラストの練習。

はい。無理です。こんなに1年で、できません。いや、寝る間も惜しんで、ケツに火つければもしかしたらイケるかもしれません。でもやりたくはありません。

しかも抱負じゃねぇ。
この中から、抱負になりそうなのはJavaScript,PHP...などのWebプログラミングですね。
何かと今ホットなJavaScriptなのでやってみたいです。
てな訳で今年の抱負はJavaScriptを使ってみることにします。同時にPHPとかでWebプログラミングできれば一石二鳥ですね。 WebGL辺りも絡めて出来れば最高かな。

まぁこんな感じです。

皆様も今年の抱負を決めていないなら、決めてみるといいです。やる気がわきます。
まぁ、unityは継続して使っていくんですけどね。あくまでこの抱負は趣味の範囲内で収めておくこととします。

では、今年もよいお年を!



2014年11月18日火曜日

photonでのシーン切り替え続きみたいなもの

どーも、siroponnです。
久しぶりに投稿かな。
今回は、前回書いたphotonでのシーン切り替えの続きみたいなものです。
前回photonでRoomシーン(Photonのルームとは違います)からGameシーンに遷移した部分で終わりました。今度はGameシーンからRoomシーンに行く部分を書こうと思います。
Roomシーンに行くのは簡単で、前回とは逆に実装します。

今回はゲームオーバになったとしましょう。

こんな感じかな?

//----------Gameシーンの方にあるスクリプト抜粋--------------------

 //ゲームオーバになったら.
 if (PhotonNetwork.player.isMasterClient && (localWaitTime >= 4f) && (!isOver) )
 {
             isOver = true;

             PhotonNetwork.room.open = false;

             PhotonNetwork.room.visible = false;

             ExitGames.Client.Photon.Hashtable h = new ExitGames.Client.Photon.Hashtable() { { "GS", GameState.Progress } };

             PhotonNetwork.player.SetCustomProperties(h);

             ExitGames.Client.Photon.Hashtable hh = new ExitGames.Client.Photon.Hashtable() { { "BS", "Ending" } };

             PhotonNetwork.room.SetCustomProperties(hh);

             PhotonNetwork.DestroyAll();

             pPview.RPC("ReturnToRoom", PhotonTargets.All);
}

ルームを閉じて、視えなくして、プレイヤ、ルームのプロパティ変更してphotonで生成したobject全部ぶっ壊してます。

PhotonNetowrk.DestroyAll();はやらないと、Buffer上(?)にobject情報が残るっぽいです。
やらずに、他のunityのシーンでこれを呼ぶと怒られます。

話は戻って、Gameシーン上からRoomシーンに戻ってきたら現在Photonに繋がっていてルームの中に存在するかを判定。


//----------Roomシーンにある方のスクリプト抜粋----------
 void Start()
{
            PhotonNetwork.isMessageQueueRunning = true;

            if (PhotonNetwork.connected && PhotonNetwork.inRoom) //Gameからかえってきたら.
            {
                ExitGames.Client.Photon.Hashtable h = new HashTable() { { "GS", GameState.Room } };

                PhotonNetwork.player.SetCustomProperties(h); //自分のプロパティを戻す.

                if (PhotonNetwork.player.isMasterClient)
                {
                     PhotonNetwork.room.open = true;

                     PhotonNetwork.room.visible = true;

                     ExitGames.Client.Photon.Hashtable hh = new HashTable() { { "BS", "idle" } };

                     PhotonNetwork.room.SetCustomProperties(hh); //準備中に戻す
                  
                }

               sceneState = SceneState.Room;

           }
            else //起動時のみ.
                sceneState = SceneState.Title;
  
}

//------------------------

sceneStateは独自で定義した列挙型です。これで、RoomシーンでもLobyに居るかRoomにいるか、はたまたまだ接続してすらいないかを判定しています。

GameシーンからRoomシーンに戻ってくるのでStartがもう一回呼び出されますね。

このやり方は1シーンだけでやってる時は出来ません。注意してください。

はい、後は特別お話することもありません。
お疲れさまでした。

今度は1シーンだけでやる方法も書きたいな。

2014年10月13日月曜日

Application.persistentDataPathでエラーが出る

おーすsiroponnです。

今回はApplication.persistentDataPathでエラーが出る件についてです。
先日Application.persistentDataPathにWWWクラスでアクセスしたらこんなエラーを取得しました。

java.net.MalformedURLException; protocol not found;
/data/data/com.hoge.hoge2/files/hoge3.txt

てな感じです.hogeは適当な値です。

どうやら、WWWではApplication.persistentDataPathにはアクセス出来ないみたいです。
もしかしたら出来るのかもしれませんが、僕は出来ませんでした。
ただ、FileクラスやFileStreamではアクセスできるみたいなのでそちらを使えばよいみたいです。
その場合は非同期の方がいいですよね。めんど。
まぁ、C#5.0(.NetFramework4.5?)になってからasync:awaitなる、非同期を楽に記述できるものがあるから結構楽にできるっぽい?
ただ、僕の家のeditorだと対応していない。2010のVSだからか。それとも.NetFramework4.5が入っていないからか。ただ、有料版で結構使いやすいから手放せない。

まぁそんなことはどうでもいいか。とりあえず、みなさんはお気をつけてください。これで1~2時間無駄にしましたので。

Poka!


2014年10月6日月曜日

シーンにオブジェクトを残したい時

おひさです。siroponnです。
PUNでシーンにオブジェクトを残したい時についてです。
PhotonNetwork.Instantiate(略)だと、そのObjectを生成したプレイヤーが抜けた時、消えてしまいます。
そういう時はPhotonNetwork.InstantiateSceneObjectメソッドを使いましょう。
これで生成されたオブジェクトはownerIDが0になり、sceneが所有していることになります。
ただ、このメソッドを呼べるのはMasterClientのみっぽいです。
フィールドで全てのキャラが共通で使うものに使えそうです。

あとはPhotonNetwork.autoCleanUpPlayerObjectsを変えることで同じことができそうかも。
僕の方でも検証してみますが、 興味を持ったら検証してみてください。

じゃ、また今度。