時代に翻弄されるエンジニアのブログ

ゲームプログラマをやっています。仕事やゲームや趣味に関してつらつら書きたいと思います。

なぜ人はカフェに行きたくなるのか?

f:id:tkymx83:20200209200738p:plain
こんにちは、みなさんカフェに行っていますか?

僕はプログラミングや勉強をしたいときによくカフェを利用します。
なぜこんなにもカフェに行きたくなるんだろうと思って記事を書きました。

※この記事にかかれていることは一部主観が含まれます。

なぜカフェに行くのか?

勉強は家でも出来ます。なぜカフェに行くのか?

一言でいうと、孤独から逃れ自分が本来したい作業に集中するためです。

ではまず孤独について説明したいと思います。

孤独とは?

孤独という言葉を検索すると、「自分がひとりである」といった結果が出てきます。
ja.wikipedia.org

これは状態を表しているのですが、社会的に孤独とは、社会に所属していないと感じることを言います。

人間はこの孤独を嫌うように出来ています。古代から人間は他の生物に比べて社会性を特化させることで発展してきました。社会性とは狩りをするときなどに複数人で協力して物事を成し遂げる能力のことです。つまり孤独を感じない場合は、人と協力することが出来ないため、食料を獲得できずに餓死をするということです。

その結果、孤独を嫌うように人間は進歩してきました。

孤独を避けるために

この孤独を避けるために、人間は社会に属することで孤独から脱出してきました。つまりは自分が社会に属していることを感じる必要があるということです。

カフェは孤独を紛らわす

カフェではいろいろなことから社会性を感じることが出来ます。

  • 店員さんなど他の人間を感じることができる
  • 変な行動を取ることが出来ない
  • 周りの人間にも人生があることがわかる

この出来事を通して、自分が社会の一部であることを実感し、孤独を紛らわせ、本来やりたかったことに集中にすることができるのです。

家でグダグダするということ

カフェに行く人に理由を聞くと、家だとグダグダしてしまうと行ったことを聞きます。

これも、社会的な孤独を紛らわす行動であると考えると説明が付きます。SNSは簡単に自分の周りに社会が存在することを私達に伝えてくれます。アニメや漫画などのエンターテイメントは没入することで孤独を感じなくしてくれます。

このように孤独から逃れるためにグダグダしているとも言えます。

まとめ

ここまで持論に付き合っていただきありがとうございます。

まとめると、カフェに行く理由は孤独から逃れ自分の本来集中したかったことに集中するためです。

反対に、孤独を感じないのだとしたら家で作業することもできるということです。

遠くない未来、VR等の技術で誰とでも繋がる世界が来たときに、孤独を超えることができるのかもしれません。

孤独について参考

「SimCity Buildit」 から学べること1

f:id:tkymx83:20200107010716p:plain

今日は スマホアプリ「SimCity Buildit」を遊んだ感想をつらつら書いていきたいと思います。
とりあえず、遊んでみて思ったことを書いていきたいと思います。

SimCity Buildit」とは?

長年ユーザーに親しまれているシムシティースマホ版のゲームです。
お金と資源を使用して街を大きくしていくことを目的としています。

www.ea.com

基本的なゲームのループ

1. 工場で素材を生成
2. 建物を建設
3. ユーザーのレベルを上げる
4. 新しい施設を建設する

ゲームの面白い点

施設にはいろいろな種類があり、組み合わせることで街を発展させることができます。
例えば

  • 住民が多くなってきて、電気の供給が必要な場合は、電力発電施設を建設する必要があります。
  • 火事が多くなっている場合は、消防施設を建設する必要があります。
  • 素材を生産する工場は公害が発生するので、住宅地からは離さなくてはいけません。

このように施設同士の配置を工夫して組み合わせて、住んでる住人が満足でき、町の人口もどんどん増えるような状態に持っていくことがこのゲームの醍醐味です。

ゲームづくりの参考になる点

ここからは、自作ゲームに取り入れたい点を書いていきたいと思います。
まずは、ゲームの深いところというよりは表面的な感想を書きたいと思います。

取得したアイテムが、アニメーションによって何に寄与するのかがわかる

例えばお金を獲得したときに、お金のアイコンがお金の数値を表示しているところに、スルスルっと移動していきます。移動した後、お金の値がふえることから、今行った動作によってお金が増えたことがわかります。もしこれがない場合は、自分の動作によって何が増えたのかわかりません。

このようにアニメーションを使うことで、自分の行動に対するフィードバッグをつくって、何をすることでどうなるのかをわかりやすく提示できます。

新しい建物を建築できる場合はビックリマークなどで強調する

まだ建築できる建物がある場合は、それを建てたくなるのが人間の性です。強調がなにもない場合を考えると、何を実行していいか迷子になる可能性もあります。その意味も込めて、なにか実行してほしいことがある場合はビックリマークなどで強調してあげることが大切です。

シミュレーションゲームの序盤は街をどんどん大きくしたかったので、とりあえずすべて建設したいという気持ちになりました。そのときにビックリマークがあると、押してビックリマークをとりあえず消したくなるので、ゲームを嫌でも進めてしまいました。

動作の説明ややってほしいことを youtube に飛ばす

未知のエリアをタップしたときに、そのエリアの説明の youtube にリンクする機能がありました。操作説明を伝えることはゲームでは一番難しいです。なぜ難しいかというと想像ができないからです。それを動画で行うのはとてもわかりやすいです。さらにyoutube で行うと、ほかメディアにも掲載ができるので一石二鳥になると思いました。

コインは長期的、素材は短期的な目標になる

ゲームとして長期的目標は大切です。頑張る糧になるからです。このゲームでは新しい建物を設置するためにコインを増やすことが一つの目標になりました。そのために、いろいろな建物を設置しては、クエストをクリアしていました。しかし、長期目標だけでは途中で中だるみします。

そのときに必要なのが短期目標です。このゲームでは素材の生産とそれによって住宅をアップデートすることが短期的な目標になりました。素材の生産は数分で終わるので、素材を生産して、建物を立ててコインをゲットすることで飽きずにずっと続ける糧になりました。

おわりに

SimCity はまちづくりシミュレーションの最高峰なので色々勉強になります。まちづくりはいろいろな要素の組み合わせで成り立っているので、最適な組み合わせを見つけたときはとても大きな達成感を得ることができます。

コレ自体は、SimCity の面白さですが、そのような面白さを自分のゲームでも見つけていきたいです。

2020 年について

f:id:tkymx83:20200105234701p:plain
あけましておめでとうございます。
2020 年になったので、今年について書いていきたいと思います。

端的にいうこと、今年は露出を増やしていきたいと思っています。
本名を出さない程度に(検索したらだいたい出てくるが。。。。。ネット怖い)

買い切りゲームを作成する

今作成中の「みんなのねずみ〜ぱ〜く」をベースにして本格的なシミュレーションゲームを作成したいと思います。

play.google.com

いままでは、小規模なゲームをいくらか作成していましたが、仕事でゲームを作る力をつけてきたので今年は中規模程度のゲームに挑戦したいと思います。

本当はゲームの運用も行っていきたいですが、個人で行うのは難しいので、買い切りで楽しいところのみを詰め込んだゲームを作りたいと思います。

ちょっとくすっとするようなゲーム展開が病みつきになるようなゲームを目指しています。

露出を増やす

いままでは、内内にやっていましたが、SNS含めていろいろなところで発信していこうと思います。

ゲームの宣伝などをしたいのも1つの理由ですが、1番の理由は、自分のエンタメ性が世の中にどんなふうに受け入れられるのかをみたいからだと思っています。

イベントなどへの出店も含めて露出する機会を増やしていこうと思います。また、個人ホームページの作成や、つくったゲームの紹介サイトなど、いろいろな情報を発信する機会を増やしたいと思います。

仲間を増やす

自分はプログラマなので、デザインやプランニングをやってくれる人がほしいです。

現在は自分の世界を表現できるように色々と基礎的なことを勉強していますが、最終的には専門で頼める人がほしいとおもっています。

仲間というと無給で一緒にやってくれる人とという感じだが、どちらかというと外注できる人がほしいと思っています。

終わりに

個人ゲーム制作戦国時代におそすぎるスタートかもしれないですけど、ある程度やってみて、今年の終わりに次のステップについて考えたいと考えています。

以上今年の自分よろしく。

ということで以下PRです。

PR

  • みんなのねずみ〜ぱ〜く

ねずみの遊び場を作るシミュレーションゲーム。ベータ版を公開中
play.google.com

  • 「みんなのねずみ〜ぱ〜く」をいっしょに作ってくれる人を募集

UIデザインや3Dモデリングまわりのデザイナーのかたで興味のある人は連絡をください(緩募)
成果報酬というよりも、制作物に対してお金をだします。

github.com
「みんなのねずみ〜ぱ〜く」の開発でだいぶ草が生えてきた。

twitter.com

play.google.com

2D UI がタップされたかを知りたい

f:id:tkymx83:20200105222959p:plain

こんにちは、いつも検索することをブログにしようプロジェクト

今日は、Unity の 2D UI をタップしているかを知る方法について記事化します。

どんなときに使うの?

ゲームにおいて、タップとは以下の2つの意味合いがあります。

  • 3D 空間のオブジェクトをタップする
  • 2D UI のオブジェクトをタップする

ここで問題があります。 3Dオブジェクト上に2D UI がある場合、どちらをタップしているかわからないという問題です。

このようなときに対処法がいくつかあると思いますが、よく使われる方法は、2D UI をタップしていなかったら、3D オブジェクトのタップ判定を行うという方法です。

このときに、「2D UI をタップしているか?」を知りたくなります。

2D UI のタップを取得する方法。

if(EventSystem.current.currentSelectedGameObject != null) {
    // 2D UI をタップ
}

以上です。

簡単に説明すると、currentSelectedGameObject には、現在タップされているオブジェクトの GameObject が格納されています。

そのため、格納されているものが無いということは、2D UI 上をタップしていないということになります。

注意

タップを検知する方法は色々あります。他サイトでは以下のように紹介されている場合もあります。

if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) {
    // 2D UI をタップ
}

こちら、実機では正常に動作しません。fingerId が 常に -1 を帰す場合があるようで、エディターでは正常に動作するように見えても、実際実機で見てみたら、動作をしなかったということもあるようです。

終わりに

EventSystem やマルチタップ周りの知識があやふやなので、Update したい。。。

Visual Studio Code で戻るの反対を行う方法

f:id:tkymx83:20191218001241p:plain

こんにちは、今日は感動したことがあったので久々にブログを更新しようと思います。

結論から話すと、戻る機能の反対は 「Ctrl + _」 で実現できます。

Visual Studio Code とは?

Visual Studio Code とは、 microsoft 社製の テキストエディターです。
azure.microsoft.com


拡張性の高さから、IDEの代わりとして使用されることもいいです。
僕自身もUnityで開発をするときのソースコードエディターとして使用しています。

戻る機能とは

戻る機能(正式用語ではないです)とは、以前見たソースコードに移動する機能です。

コーディングを行っていると、複数のソースコードを周回することが多々あります。

定義などをたどっていくと、定義をたどる前の位置に戻りたいときがあります。

そのときに使用できるのが「戻る機能」です。

「Ctrl + -」 のショートカットキーを押すことで実現できます。

この戻る機能は便利なのですが、時には逆に「進む」を実行したいときがあります。

しかし、この機能のショートカットをネットで調べても出ては来なかったのです。

※ 以下のサイトのようにそれっぽい記載は見つかりますが、実際に試しても実現できずでした。
code.visualstudio.com

どうやって調査をしたのか?

まずはじめに行ったことは、「戻る機能」の正式用語を調べるということです。

Visual Studio Code で Cmd + Shift + p を押して key と入力すると、候補にショートカットキー一覧が出てきます。

f:id:tkymx83:20191218000407p:plain

クリックすると以下のようにショートカットが複数出ます。

f:id:tkymx83:20191218000442p:plain

ショートカットキーの検索ができるので、ここで、「ctrl - 」と検索すると「戻る機能」に該当するショートカットを調べることができます。

f:id:tkymx83:20191218000626p:plain

この時点で、僕が「戻る機能」といっていた機能が 「Back」 もしくは、「Go Back」 であるとわかりました。

反対を調べる

ここまで来ると、察しが付くと思いますが、Backの反対は?ということでFoward を調べてみました。

f:id:tkymx83:20191218000840p:plain

すると上のように、Go Forward (ctrl + _)が見つかりました。

結果

個人的には、長年わからなかったことがわかりスッキリしました。

「-」と「_」 なので、はっきり言って見間違える可能性もあります。

調べている過程でショートカットキーの種類の豊富さもわかったので、今度はいくつか便利なものを紹介したいと思います。

Vertical Layout Group で上のオブジェクトのみ高さを固定したい

f:id:tkymx83:20191110120309p:plain

こんにちは、今日は Unity で Vertical Layout Group を使っていて一番上の要素のみ固定したいという長年の悩みが解決したので報告します。

どういうこと?

以下の画像のように、ある画面において、上の要素は高さを固定して、下の要素は柔軟にサイズが変更されるような画面を作るということです。今日はこの設定について解説します。

f:id:tkymx83:20191110114757g:plain

対象の画面の構成

画像中のヒエラルキーの選択されている部分が今回対象の画面の要素になります。

  • MonoTab : 画面全体のサイズを持っている親の要素
  • TopBar : 上の要素(サイズを固定したい)
  • Contents : 下の要素(柔軟にサイズを変更したい)

f:id:tkymx83:20191110114433p:plain

親要素(MonoTab)の説明

今回垂直に自動でレイアウトを設定する必要があったため、Vertical layout Group コンポーネントを設定いたしました。

子要素の高さを自動的に変更したかったため、「Child Controls Size」のみ Heightにチェックを付けています。

※ 今回は高さのレイアウトを変えたかったため、幅に関してはすべて親に合わせる設定となっています。

f:id:tkymx83:20191110114508p:plain

上要素の設定(TopBr)の説明

LayoutElement コンポーネントを設定し、固定幅の設定をしています。まず、サイズを 30 にしたかったので、「Min Height」に 30 をせってしています。(「Preferrend Height」でも大丈夫です。)

そして、柔軟にサイズが変更されないように、「Flexible Height」は 0 にしています。この設定を行うことで、要素サイズを固定に設定ができます。

※ Horizontal Layout Group が設定されておりますが、こちらは別用途のために設定しているので、今回の説明には関係ありません。設定しないでください。

f:id:tkymx83:20191110114534p:plain

下要素の設定(Contents)の説明

LayoutElement コンポーネントを設定し、柔軟幅の設定をしています。柔軟にサイズを変更してほしかったので、「Flexible Height」を 1 に設定しています。

f:id:tkymx83:20191110114553p:plain

まとめ

今回は、Vertical Layout Group において、上要素はサイズを固定して、下要素は柔軟にサイズを変更させたい場合の設定について解説しました。

「Flexible Height」は全体に対して、何割のサイズにするかを設定する項目のようで、0 にすることで、固定幅になるようです。

ただ、Layout Element を使用する場合は親配下のすべてのオブジェクトにつける必要があるようです。

Unityで画面をタップした位置のオブジェクトの情報が知りたい

f:id:tkymx83:20191023010427p:plain
こんにちは、今日はゲームを作っています。

シムシティのようなシミュレーションゲームなどでマウスを使って建物を設置したい時はありませんか?
今回はUnity でどのように行うかを解説します。

やりたいこと

画面をタップして初めてオブジェクトとあたった地点がほしい

コード

using UnityEngine;

/*諸々省略*/

Camera mainCamera = /*使用するカメラを指定*/
var ray = mainCamera.ScreenPointToRay(Input.mousePosition);

RaycastHit Hit;
if (Physics.Raycast(ray, out Hit))
{
    Debug.Log(Hit.point);
}

概要

  • マウスでタッチした位置にカメラからのレイを飛ばす
    • レイは光線のようなもので3D空間内の直線と考えてください。
  • ヒットしていればその地点の座標を表示する

登場人物

Camera.ScreenPointToRay

カメラから指定地点までのレイを作成します。
docs.unity3d.com

Physics.Raycast

レイとGameObjectの当たり判定を行う
docs.unity3d.com

RaycastHit

Physics.Raycast の結果を格納する。よく使う変数の紹介をします

  • point :あたった地点
  • distance : レイの原点(今回はカメラ位置)までの距離
  • transform:あたったコライダーの Transform

docs.unity3d.com

まとめ

Unity では簡単に画面タップ処理がかけていいですね。レイの当たり判定を手書きしようとすると計算量の問題とあたり判定の複雑さで死にそうになります。