AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

カフェを追加

f:id:yasu9780:20201108174219g:plain

cafeを追加。
全体制御から指示をすると番号0と番号1のキャラがカフェに向かって座る

後は、お腹がすいたらカフェに向かうとか、ソファに座ったらメイドが注文を取りに来るとかすればOK

SGSでは、レストランの形態として

  1. セルフ=学校食堂、自動販売
  2. オーダー=メイド喫茶バーガーショップ
  3. ブッフェ=ブッフェレストラン

と3種類あった。現実のレストランの形態だと、セルフでも先払いと後払いがあったり、オーダーでも人にオーダーしたり、テーブルでタブレットでオーダーしたりある

店によってコードを新しく追加してたけど、一つモジュールですべての店を表現して、店の追加が簡単にできるようにしたい

交通システム:車もNavMesh、歩行者を増やした

自動車もNavMeshの上でのWayPoint巡回に切り替えた。これでトラックが倉庫からお店に移動したりもできるはず。
それと、歩行者を15人ぐらいSpawnするようにした。疲れると走るのを辞めて歩き始める。椅子に座ると回復してまた走り出す。

f:id:yasu9780:20201108112723g:plain

NavMeshSurfaceだと、LayerがAllだと車もNavMeshの要素になってしまうので、Layerを分けないと、初期の車の場所に意図しない障害物があるようにみなされて訳が分からないようになるので注意がいる。
元のNavMeshはstatic指定してたからそういうことはなかったけど


あとは、もっとやるなら、車線を2車線・2車線の道路を作ってみるとか、陸橋を作るとか
歩行者も歩道橋を作るとか。

交通システムはこのくらいにして、次はお店を作ってみましょうかねえ


GTAPlayStation2の時代からちゃんと信号もあって、大規模マップ
性能的には今のスマホの方が上だろうけど、とても追いつけない( ^ω^ )GTA凄すぎる
GTAは元々はPS1からあるけど)
www.youtube.com


お店の中は中に入ったら動的に生成するかシーン切替
ってのが定石なんだろうけど、窓越しに店に中が見えるのも捨てがたい

SGSのUnity2017版をひさしぶりに動かしてみる

現在のSGSはUnity5.6で動いているけど、AndroidAPIを上げないとアップデートできないのと、来年は64ビット対応もしないといけない(Unity5.6の特例で締め切りが1年伸びている)
Unityの対応バージョンを上げていかないといけないのだけど、
自由度が高い=コード量がものすごい量あるということで、もはや開発者ですら容易には触れない状態になっている
しかも1年以上コードに触ってないので、余計に「なんじゃこりゃ」状態になっている

ただ、未検証だけど動くUnity2017版があって、久しぶりに起動してみたけど、クリスマスだった。
去年じゃなくて、おそらくおととしのクリスマスバージョンなんじゃないかと思う。

f:id:yasu9780:20201107223719p:plain
SGS Unity2017版

いちおう動いてはいるけれど、Unity5.6のアセットをすべて、Unity2017の空プロジェクトにコピーしただけという強引な奴だった記憶がある
普通にUnity2017にバージョンアップしたら動かなかった記憶もあるし、
そしてUnity2018はダメだった記憶もある

年内に一回はアップデートしたいんだけど、いまさらUnity5.6ってわけにもいけないしなあ
APIが29に対応できればUnity5.6でもアップデートできるんだろうけど
64bit対応は2021/8が締め切りだから、まだ余裕があるといえばあるけど。

とりあえずUnity5.6でアップデートして、Unity2017対応を頑張りつつ、次世代バージョンのSSGのインフラ作りでもやっていこうかなと。

Androidのbuild settingを確認したらAPI29まで選べるようになってるので、Android StudioAPI自体はインストールしてるみたい

f:id:yasu9780:20201107230558p:plain
SGS Unity5.6版

Unity5.6の現行最新版を動かしてみたけど、APIは25までしか選べないけど、Target APIをAutomaticにしておいて、XMLの設定の方でAPI29を指定しておけば行けたような気がする。
ただ、アップデートして失敗してると非常にヤバいので、できれば、ベータ版リリースして、ユーザーさんの動作チェックしてもらったうえで、正式版アップデートの流れにしたいのだけど、
ただ、64bit対応してないので、新規にUnity5.6でアップロードはできないはず。・゚・(ノ∀`)・゚・。 

ベータ版で新規アップロードならUnity2017でx64対応してやるか、Unity5.6なら現行版の差し替えでアップデートするしかない
怖すぎる( ^ω^ )

どうせ1年以上アップデートしてないんだから、二か月ぐらいでSGS2のベータ版をUnity2018で作った方が話がシンプルかもしれない
うーん 明日考えよう

node.jsのサーバーとUnityクライアントでソケット通信

UnityでOculus Quest用のVRアプリを作ってみると、Questとの通信はnode.jsで行っているようなので、ちょっとnode.jsを試してみました。
借りているSakuraVPSにnode.jsをインストールしてサーバーを立ててみます。

centos7上で、node.jsをインストールします。

yum install nodejs
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(port番号は秘密);

というのをhelloworld.jsで保存して、

node helloworld.js&

と実行します。
指定したポート番号をListenした状態でサーバーが常駐します。

Windowsのコンソールから、サーバーのグローバルIPアドレスにserverで指定したport番号を指定してcurlで接続します。
Hello WorldがSakuraVPS上のサーバーから帰ってきます

これを実現するには、CentOS側のfirewalldでポート番号を開けておく必要があります。
同様にクライアント側のWindowsも指定したポート番号を開けておく必要があります。

次はさっそくクライアントをUnityにしてみましょう。
と思って、
websocket-sharpというソースをDLしてみたり、アセットストアでSocketIO関係のツールを買ってみたりしましたが、クライアントから接続できません。
windowsのコンソールからはつながるので、セキュリティ設定の問題ではないと思うのですが、
半日ぐらい悩みましたが、上記のサーバーのサンプルはhttpプロトコルになっていて、Unity用のクライアントは、WebSocketというプロトコルでそこに違いがあったようです。

websocket-sharpのクライアントのソースを、以下のws:の部分をhttp;に変えてもDLL自体がエラーになるだけでした( ^ω^ )

        ws = new WebSocket("ws://VPSのグローバルIP:ポート番号/");

というわけで、サーバー側をWebSocketに変えてみます。

const server = require('ws').Server;
const ws = new server({ port: ポート番号は秘密 });

ws.on('connection', socket => {
  socket.on('message', ms => {
    ws.clients.forEach(client => {
      client.send('Hello, this message comes from server!');
    });
  });

  socket.on('close', () => {
    console.log('good bye.');
  });
});

しかし、これをnodeで実行するとエラーになります。wsが見つからないみたいなエラーです
wsはおそらくWebSocketの略でしょう
検索しても古い情報が多く、

npm install socket.io

でインストールできるようですが、これではインストールできませんでした。yumでは無いんでしょうか?
CentOS - centOS7にてsocket.ioのインストールがうまくいかない|teratail

上記のページを参考に、

npm install socket.io@1.3.6

でインストールできました
これでwsを使った上記のサーバーを常駐し、

websocket-sharpのクライアントが無事動きました!。・゚・(ノ∀`)・゚・。 

f:id:yasu9780:20201103230237p:plain

やった!ついにソケット通信できた!
ソケット通信は去年ぐらいからPerlでサーバーを作ったりして時々やってたんですが、全然うまく行かなかったんですが、感動しました。・゚・(ノ∀`)・゚・。 
アセットストアで買ったアセットには、Andorid/iOS/WebGL/PCに対応したものもあったので、そのへんもやってみたい。
上記のサーバーサンプルはソケット通信が接続しているクライアントすべてにメッセージを送るものです。

仕組み的には、ユーザーのIDと位置・向きをサーバーに送信すると、サーバーが全ユーザーに情報を再送信すればネットゲームが作れますね
(実際は、遅延のある通信環境でなめらかに動かす技術や通信料を削減する技術などがたくさんある)


qiita.com

note.com

qiita.com

交差点でランダムに車を右折か左折

f:id:yasu9780:20201101123950g:plain

バスを追加したり、交差点で、車が左折するか右折するかをランダムに変えたりしてみた
まだ、交差点の信号は完成してないけど、車の信号停止や前の車が停止したので自分も止まるあたりはうまく動くようになった

問題点は、交差点で曲がる時に直進車の確認をしてないので、車同士の衝突が起きまくっている
今は物理をいれてないけど、入れればぶつかって車が跳ね回るでしょう
直進車の確認をしようと思うとRAYを飛ばしてやるのかな? そうなると自動運転のシミュレーションみたいになってくるので
ちょっと面倒くさいかな
あと、現状車はwayPoint巡回だけど、歩行者とは別に車だけのNavMeshをやるべきかも
そうしないと車を、どこかの家とか倉庫とかに向かわせるときに経路が解らないので、ランダム走行しかできない

東京テアトルの優待券が7枚残ってる

10月末期限の東京テアトルの映画の株主優待券が7枚も余ってる
今日が期限。・゚・(ノ∀`)・゚・。 
コロナもあったし、映画館に行かなかったら大量に余ってしまった。
一昨日は池袋のシネリーブル池袋に鬼滅の刃を見に行きましたが、土日に株主優待券で行くのは劇場に迷惑だろうということで、おそらく空いている平日の昼間に行きましたが、さすがの鬼滅の刃でもシネリーブル池袋だとお客さんは10人ぐらいの入りでした。・゚・(ノ∀`)・゚・。 

たしかにクオリティは高いですね。冒頭シーンの森のシーンから高品質な3Dな森でかつ2Dアニメとのマッチングもすばらしく違和感なし
蒸気機関車も自然になじんでる感じでした。
しかし、2時間映画としてはかなりストーリーは単純ですね。ほとんどのシーンがバトルシーンだし、あとは各キャラの夢の世界の描写
炎柱・煉獄杏寿郎が主人公みたいなもんなんでしょうけど、TVシリーズでそんなに出てるわけじゃないし、漫画も読んでないので、そこまで感情移入できないんだけど、登場人物はめちゃめちゃ泣いてるから、もう見てる側も泣くしかないという感じでした
あと、よく解らない彼のお父さんより、死んだ母上の方が、とてても扱いが良いので、見ていた母親層のお客さんなんかは納得感が高いのではないだろうか?
あと、けっこう冒頭からギャグシーンが多いので、子供の笑い声も聞こえてました。
必殺技に名前がついているというのは子供に人気が出るには必須条件なんだろうと思いました。


ただ、うーんと思ったのが、煉獄さんとか炭治郎の夢の世界はとてもまともなのですが、あの人気投票で1位になる黄色の我妻善逸と嘴平伊之助の夢の世界がヤバいですねw かなりの闇を抱えている
相変わらず禰豆子があまり活躍しないけど、そのくらいの露出でいいのかもしれない。

あと、敵の気持ち悪さが、かなりハガレンを思い出しますね。思考回路とかが近いというか。強欲の人とか。

列車と言うことで、甲鉄城のカバネリも連想してましたが、あっちは完全にゾンビ映画のノリですが、鬼滅の刃の映画は、鬼が基本一人で、乗客も寝てるので、ゾンビ映画のノリはほぼなかったので、カバネリっぽくはなかったですね。
機関車を止めてはいけないいう緊迫感は描いてなかったし(運転手も出てくるけど、そういう流れは無い)


ということで、昼からまた映画を見てきますが、予定では4本見てきます。
本当は9:20からの「星の子」を見るつもりだったのですが、ぐずぐずしてたら時間が間に合わなくなった

鬼滅の刃のコミックをネットカフェで読んできた

12巻までしか棚に入ってなかったのでそこまでしか読んでないけど
むちゃくちゃ面白かった
個人的には遊郭編からとても面白い
そして、アニメが非常に漫画に忠実に作られていることが解る
正直、無限列車より、遊郭の方がキャラも増えて断然面白いと思った
Ufortableは絶対遊郭編も映画にすると思うけど、200億円の無限列車よりも、さらに面白い映画になると思うわ
今度13巻以降も読みに行こう( ^ω^ )

交通システム:歩行者信号も作った

f:id:yasu9780:20201031093204g:plain

歩行者信号を作った

信号は車道と横断歩道は連動してるので、まとめて切替
交差点は4方向が全部連動してるので、これも一つの信号としてまとめて切り替えないといけませんね

あとは、車がちゃんと横断歩道に入らないで止まれなかったり、車間距離が詰めすぎたり、