おしるこの作り方

だらだら書く

今年を振り返る

昨日を振り返る

昨日のリアル潜入ゲームで歩くのがままならないくらい筋肉痛です。
でも面白かったです。 シンデレラのほうも良かったです。
なんかいつもよりお金かかってる気がした。
(リアル脱出ゲームの感想ってネタバレ出来ないから難しい)

振り返っても大したことが出てこない

  • 学部を卒業して院生になった
  • ミリオン5thライブに行った
  • レヴュースタァライトが面白かった
  • マクロスのMX4Dに行った
  • プラモデルを始めた
  • グラブルフェスに行った
  • 秋アニメは豊作だった

前半の記憶が既にほとんど消えている…

卒業

大変だったけどそれは去年サボってたからであって
それ以外は、まあ無難に。

ミリ5th

今年1番記憶に残っているのでは?
余りに見切れ席だったからね...

プラモデル

既にさぼってる。
というかまとまった時間が取れないと
作業出来ないので新年の休みの内に進捗を出したい

グラブルフェス

ナイトパーティーだけだったけどグラブルの音OFFにしがちなので
今後はONにしてやろうと思えるくらい生演奏良かったのでとても満足!

アニメ

レヴュースタァライトはなんか今考えても何が何だかって感じだけど面白かったです。 適当なタイミングで見返したい。
秋アニメは * ゾンビランドサガ * SSSS.GRIDMAN * RELEASE THE SPYCE が良かったですね。 どれも話がちゃんと最後で締めれていたので見終わったときにスッキリできた。 ゾンビランドサガだけは2期を期待させる終わりだったので期待。

ゲーム

↑の箇条に一切ないけど… * MHW * スマブラ * DbD * Hacknet 辺りが今年やったゲームですね。 どれも面白かったのでとても満足している。 人気タイトルが多いけどHacknetだけちょい特殊かなという感じ。 来年は昔やったゲームとか名作とかをやっていきたいと考えていたりする。 (理由はあんまりない)

おわり

特にこれ!っていうことがあったわけでもないけど
逆に平和だった上にいろいろ楽しかったので
総合的にはいい1年だったかなと思います。

大人がゲームをやめる理由

はじめに

ゾンビランドサガ面白かったですね!(宣伝

それはそれとしてタイトルなんですけど 別に世紀の大発見でもなんでもなく考えれば当たり前のことが実感として湧いてきたので なんとなくブログに書いとこうかなと。
実感が湧いてきた理由としてはいくつかあるんですが 僕は修士になり、周りが就職したというのは大きいと思います。

大人がゲームをやめる理由

大きく4つあると思います。
私が実感としてあるのは4つめが特に大きいですね…

1.ただただ飽きた

まあこれは大人だろうが子供だろうが関係ない。
趣味に飽きることだってあります。
ゲームは沢山種類あるし飽きづらい方だとは思いますが。

2.忙しくなった

仕方なし。
周りの人間を見てても平日はガッツリやる時間は取れてなさそうかなという感じがします。
ゲームの種類にもよりますが集中力が必要なゲームとかは会社で疲れて帰ってきてからやるのはなかなか辛いんじゃないでしょうか。
あとはずっと続けてきたけど忙しい時期にログイン出来なくなってそのままやることが癖じゃなくなってしまったとかは起こりうるかなと。
私もスマブラが発売されたときは有給取ったマンが周りにいたので0時から遊んでいましたが結局月曜以降にオンラインでプレイする回数っていうのは多くなかったです。
周りも学生の頃なら平日も毎日3時までプレイしてたはず。

3. 環境が変わった

簡単に言うと家族等が出来ることによるものですね。
周りに迷惑をかけないことは大切です、リアルは最優先。
私の周りでいうと先輩が彼女と同居してから夜中にボイスチャットしながらのプレイが出来なくなったとかがあります。
相手もゲーム好きで一緒にやるとかならともかく一緒に住んでる相手がずっとゲームしてたらそれはキレてもいいと思う。
仮に子供が生まれたりすると時間を取るのが難しくなることもあるでしょうし。

4.周りの人がやらなくなった

これはゲームのコミュニケーションツールとしての側面が影響していると思います。
ゲームの遊び方にもよりますが、対面でワイワイやるのが好きな人とかボイスチャットしながらプレイするのが当たり前の人たちはたぶんゲームの面白さに加えて誰かと話すことの楽しさが加わっている状態なのでその相手がやらなくなるとそのゲームの面白さを半減して感じてしまうのかなと。
あとはプレイしているゲームの話を会ったときにするとかもありますね。
要は2,3番に当てはまる人が周りの一緒にプレイしていた人が多いと起こりうると思います。
私の場合一緒にやる相手がいないと全然プレイしないタイトルっていうのが幾つもあります。誘われて買ったゲームや人を誘って買ったゲームは特に。

お前ゲームやめるの?

やめる気はさらさらないけどプレイするゲームのジャンルが変わっていきそうな予感。
一人でやる時間が増えてきているのも事実なので2DアクションとかRPGの買い切り系のゲームが増えていくかなと。
中学生のときにFPSを始めてからオンラインゲームをメインでやってきたとこありますけどカービィとかスタフィーは割とやっていた方なので2Dアクションはたぶん好き。
昨日セール中なのに気づいたので前から気になっていたHollowKnightってやつをsteamで買いました。冬休み中にクリア出来たらいいなぁ。

おわりに

楽しけりゃなんでもいい。

メッセージ駆動を用いたマルチプレイRPGイベント処理

はじめに

この記事は私が所属しているサークルのアドベントカレンダー
デジクリ Advent Calendar 2018
の21日の記事になります。
最近はアウトプットが研究(しかもあんまりない)ところにきっかけを作ってくれた後輩には感謝です。
では本題に。

概要

メッセージ駆動を使ってRPGのイベント処理を行い、さらにマルチプレイに対応させます。
と大口をたたいてますがちょこっと実装してみただけくらいな感じです。

注意事項

実装は時間取れなかったので滅茶苦茶雑です。
一応人に見せるコードと思いながら書きましたがそれでもたぶんクソです。
それ以上に同期取らなきゃいけないイベント処理にめんどくさいからという理由でUDPを使っていたりする辺りがひどいです。
まあでもきっとこれ読んでやってみようかなと思うような人なら自分で直せるはず…(丸投げ
最初この記事書こうと思ったキッカケの話がつらつらと続くので早く本題!って人はメッセージって単語出るまで適当に飛ばしてください。

イベント駆動(イベントドリブン)

この内容でやろうと思ったきっかけのお話。

イベント駆動って?

プログラミングパラダイムの1つです。
イベント駆動では処理が上から下に流れていくのではなく、イベントを待機してイベントが発生するとそれに応じて処理が行われるという流れになります。
大学の講義やゲームプログラミングだけだと中々触る機会が無いけど一般的なソフトウェアを作る際には適しています。
GUIのソフトウェアにはボタンが多くありますが、どのボタンが押されるかというのはユーザ依存なのでどのボタンが押されたらどういう動作をするのかが分かりやすい(作りやすい?)イベント駆動が向いているのだと思います。
(実務経験皆無マンなのでこの辺は憶測入ってます)
イベント駆動については分かりやすく書いてるサイトが沢山あるので詳しくは話しませんので軽くググってみてください。

ゲームプログラミングとイベント駆動

ゲームプログラミングにイベント駆動が用いられることはあまりないと思います。
理由は色々あるとは思いますがコードが読みづらくなるとかゲームは常に状況が変化し続けるからとかがネットに転がっていました。
コードが読みづらくなるという点について言えばフロー駆動型に比べて処理順などが考慮されないので流れが分かりづらくなるというのはイベント駆動のデメリットであるのは間違いないです。
ゲームは常に状況が変化し続けるというのも実際その通りでアクションゲームなどは敵が常に動いていたりするのでループで管理した方が良いと思います。
では、動きの激しくないゲームでは使えるのでは?と思ったのが今回の記事のきっかけです。

イベント駆動に向いているゲーム?

動きが激しくなく、ボタン操作が多いゲームなどは向いているのではないかと思います。
具体的にはRPG(動きの激しくない昔のFFとかドラクエ系)、アドベンチャーゲーム等々が向いていると思います。
実際大学3年のときにはクイズゲームWindows Formsアプリケーションで作ったりしてました。(そのときは時間が無かったからですが

ググってみた

イベント駆動、ゲームとかで調べると上の方にCygamesのエンジニアブログやSlideShareなどがヒットします。
メッセージベースによるゲーム駆動(Cygames Engineers' Blog)
RPGにおけるイベント駆動型の設計と実装(SlideShare)

この2つに共通しているのがメッセージを利用しているということです。
ということで長々と話してきましたがメッセージを用いたゲームを作成していきたいと思います。
が、時間が無かったのでメッセージの便利な点を1点説明していこうと思います。

メッセージ駆動

今回扱うメッセージ駆動

(メッセージ駆動とイベント駆動を区別することもあるっぽい) 今回はゲームにおけるメッセージ駆動ということで。
メッセージ駆動にはいくつか利点がありますが今回はネットワークに関する部分の利点に着目しました。

ネットワークとメッセージ駆動

Cygamesのエンジニアブログの方にこうあります。
「受け取ったモジュールは(ここではプレイヤー処理は)、マルチプレイ中であるかどうかを考慮する必要はありません。ただ、そのメッセージを処理すれば良いのです。」
この利点を生かしてマルチプレイもどきを作っていきたいと思います。

今回作るもの

ここからやっと作ったものの話

概要

キャラクターに話しかけるとイベント(?)が始まるプログラム。(流石にゲームって呼べない)

要件

  • 1人のキャラが別のキャラの隣で話しかけるボタンを押したらイベントが始まる
  • イベントの内容はお互いの名前(player,non_player,IPアドレス)が表示される
  • イベント中のキャラには話しかけられない
  • NPCが1人いる
  • 3人以上がマルチプレイできることを想定して作る(時間なくて2人用になりましたが3人にも対応できるようには作ったので微調整すればいけるはず

開発環境

  • Unity(2018.3.0f2)
  • C#
  • VisualStudio2017 ※キャラクターやマップはAssetStoreのTinyRPGTownを使わせていただきました。

メッセージの仕様

本当はこれが一番大切なはずなのに 初めてだったのでこれが正しいってことは100%無いと思う。
何が正解だったのか…

public class Message
{
    /// <summary>
    /// メッセージクラス
    /// コマンドと引数的な感じで定義
    /// </summary>
    
    public string Order { get; set; }
    public string Option { get; set; }
    public Message(string order)
    {
        this.Order = order;
    }
    public Message(string order,string option)
    {
        this.Order = order;
        this.Option = option;
    }
}

Order:key

Optionで押されたキーを指定(KeyInputクラスから
ゲーム終了やオンライン接続などシステム的な方のキー入力を処理

Order:send

指定されたIPアドレスに送りたいデータを送信
Option:"IPアドレス>送りたいデータ"

Order:online

ネットワークを介して送られてきたデータを処理
Option:"IPアドレス+送られてきたデータ"の形

Order.player

キー入力でplayerが移動した際に発生するメッセージ
オンラインユーザに移動を通知(プレイヤー位置の同期)

Order.event

MessageManagerに送られてくる場合

キー入力でイベントが発生した際にオンラインユーザに自分のイベント開始を通知  
Option:"start"or"end"

Characterに送られてくる場合

  • キー入力でイベントが発生した際にプレイヤーから送られて来る
  • ネットワーク側でイベントが発生した際に送られて来る(イベント状態の同期

イベント発生の流れ

f:id:bluetiger_ts:20181221131345j:plain
イベントはっせいの流れ1
f:id:bluetiger_ts:20181221131349j:plain
イベントはっせいの流れ2
f:id:bluetiger_ts:20181221131352j:plain
イベントはっせいの流れ3
f:id:bluetiger_ts:20181221131355j:plain
イベントはっせいの流れ4
f:id:bluetiger_ts:20181221131358j:plain
イベントはっせいの流れ5
f:id:bluetiger_ts:20181221131342j:plain
イベントはっせいの流れ6

軽くソースコードの説明

ソースコードはこちら github.com scriptしか上げてないので動かしてみたい人はご一報ください。

MessageObject

メッセージを扱うオブジェクトの基底クラス

public class MessageObject : MonoBehaviour
{
    /// <summary>
    /// メッセージを扱うオブジェクトの基底クラス
    /// メッセージはキューで管理
    /// </summary>
    protected Queue<Message> message_queue;
    public void Start()
    {
        message_queue = new Queue<Message>();
    }
    public void Update()
    {
        if (message_queue.Count != 0)
        {
            ProcessingMessage();
        }
    }
    public virtual void ProcessingMessage()  //メッセージ処理
    {
        Debug.Log("Unimplemented");
    }
    public void MessageListner(Message mes)  //メッセージ受信
    {
        message_queue.Enqueue(mes);
    }
}

Updateメソッド内を見ればわかりますがqueueがある場合にはProcessingMessageを呼び出しています。
基本的には継承先でProcessingMessageをオーバーライドしてDequeueからの処理を想定してますが、
ここでProcessingMessageを実装しとかないとUpdateをいちいち書くことになるのであえてこういう実装にしてます。
(なんかいい方法あるのかな)

MessageManager(一部)

ProcessingMessageの実装です。

public override void ProcessingMessage()
    {
        while(message_queue.Count != 0)
        {
            var dequeue_mes = message_queue.Dequeue();
            Debug.Log("mes:"+dequeue_mes.Order+":"+dequeue_mes.Option);

            if(dequeue_mes.Order == "key")
            {
                KeyAction(dequeue_mes.Option);
            }
            else if(dequeue_mes.Order == "send")
            {
                SendMessage(dequeue_mes);
            }
            else if(dequeue_mes.Order == "online")
            {
                OnlineAction(dequeue_mes.Option);
            }
            else if(dequeue_mes.Order == "player")
            {
                foreach (var op in FindObjectsOfType<OnlinePlayer>())
                {
                    udp.SendMessage(op.IPAdress, dequeue_mes.Option);
                }
            }
            else if(dequeue_mes.Order == "event")
            {
                foreach (var op in FindObjectsOfType<OnlinePlayer>())
                {
                    udp.SendMessage(op.IPAdress, "event:" + dequeue_mes.Option);
                }
            }
        }
    }

MessageはOrderとOptionで構成されてます。(コマンドと引数的な Orderの内容によって処理を変えてます。
UDPで飛んできたものは全てOrderをonlineにして特別処理をしています。

実際の画面

f:id:bluetiger_ts:20181221042248p:plain
初期画面
f:id:bluetiger_ts:20181221042310p:plain
オンラインのプレイヤーが話しかけてきた
f:id:bluetiger_ts:20181221042706j:plain
同期されてる様子

終わりに

メッセージ管理でやったことによってマルチプレイが楽にできたかなと思います。(ほんまか?
UDP使ったり、イベント発生時のメッセージに0,1,2とか分かりづらい魔法の数字使ってたりしますがそれなりにしっかり動いたので良かったなと思います。
メッセージの仕様はしっかり定めましょう…

この記事を読んでちょっとでもメッセージ駆動とかイベント駆動に興味を持ってくれた人がいれば幸いです。

なつやすみ

なつやすみ

夏休みはブログたくさん書こうとか思ってた時期もあった。
幻想に終わりましたが...
夏休みは別段特別なこともなくほとんどが家でゲームしてたって感じでした。
あったとすればインターンに3社で計5日行ったこととゼミ合宿で新潟に行ったことくらい。

インターンは割と有意義でした。
ゲーム会社2社とIT企業1社に行きました。
結局のところ手を動かして何か作ってる方が好きということを再認識した。

新潟は”””ゼミ”””合宿だったのでがっつり観光したわけではなかったですが   ごはんおいしかったしBBQで食べ過ぎて死んでたりした。
最終日に少し宿の周りを散策する時間が取れたのですが
だいたい田んぼって感じ。
都会の喧騒から離れるのはやっぱり良いなと思いました。
田舎で家庭菜園しながらプログラムも書いて一定の収入も得たい今日この頃。
(やったらやったで家庭菜園が面倒くさくなるのわかってるけど)

研究やらなきゃな~

ウーノ取得

DbDが全く上手くなる気がしません。  

でも生き残れる率上がってるので  

多分隠れるのが上手くなってるけど  

チェイスはまだ苦手って感じなんだと思います。  

 

タイトル通りなんですがグラブル半額来たので  ちまちまやってウーノを取得しました!

f:id:bluetiger_ts:20180803023845p:image

ちょっと育っちゃってるけどね。

今回はラクリモサが一番キツくてあとは大したことなくて成長を感じましたw  

古戦場までに最終解放したいので頑張ります。 

早くウーノの火力で遊びたい!!!

 

ではでは。 

 

花火

今日は江東区の花火大会だったので  

研究室で見ながらお酒を嗜んでました。  

同期と2人で話してたのを告知したら  

最終的に11人になってとても楽しかった。

 

花火は綺麗だったけど距離が遠くて  

小さかったので言うほど楽しんだわけでは  

無かったですが夏を感じられて  

良かったです、多分今年最後の花火だしね...  

 

 

同期に彼女いない煽りされるのが辛いです

 

全然関係無いんですけどグラブルでイルザ当たって最高に夏を感じました!

f:id:bluetiger_ts:20180802031840p:image

Dead by Daylight

始めました!
楽しいけどなかなか難しいですね
特にレイスにボコられてる感じあります

明日から半額だしグラブルやらなきゃ行けないけど
就活控えてるのでスキルアップもしたいので
計画的な夏休みを過ごしたい所存ですが
経験上ゲームだけが進むんだろうなぁ

がんばろう!(弱気

昨日のガチャ運良かったなぁ
f:id:bluetiger_ts:20180801025643p:plain f:id:bluetiger_ts:20180801025712p:plain f:id:bluetiger_ts:20180801025914p:plain