敵がプレイヤー関連を狙うようにしてみた

このゲームはプレイヤーの他にもコア・ユニットと敵が狙うべき要素が多いので
そのへんを一元管理して誰を狙うべきか教えてくれるクラスを作ってみました。

ざっくり言うと
敵自身の座標を送ると、ターゲットとなる相手の座標が返ってくる感じです

まぁ内部的にはプレイヤーとコアと全ユニットの距離を調べて
一番近いものを返してるんですけどね

ユニットにはターレット型や妨害型の用意を考えていて
特に妨害型は移動の邪魔になり、攻撃の邪魔になるものなので
敵はこれを攻撃しないと流石にバカ過ぎるだろうと思うわけです。

ひとまずは現状で様子見して、もし重いようだったらいろいろ修正かけます。

Jsonファイルで敵出現情報を管理できるようになったゾイ!

前回のMiniJsonで敵出現の情報をまとめたいから更に頑張った結果
なんとかJsonファイルで敵出現の情報をまとめれるようになりました。



画面上に出現箇所をオブジェクトとして置いておいて
その位置から敵が出現してきます。
あとはどの敵が出現するのかというIDを行列で記載するだけ。

なんですが
これがまぁ、文字数と行数がすごいのなんの
テストで作ったデータだけで軽く混乱しました。

Excelのマクロなり関数なりで簡単に情報作れるようにできるようにしたいですわ。


で、ここからが開発の話

突然こんなエラーが出てきました。

InvalidCastException: Cannot cast from source type to destination type.

簡単に言うとその型を入れたいっておかしくない?ってやつです。

どんなタイミングで出たのかと言うと

EnemyCreate((int)EnemySpawn[0]);

こんなふうにリストから敵のIDを取ってこようとしたときでした。

じゃあ何故こうなったのか
そもそも「EnemySpawn」リストはObject型で情報を格納するIListを使っています。
そこに入れている大本の型が原因でした。

Jsonファイルから持ってくる数字ってint型じゃなくてlong型なんですよね。

つまりもともとlong型のものをいきなりint型にしてるんじゃねぇ!ってことだったらしいです。

なのでこのようにしたら解決しました。

EnemyCreate((int)(long)EnemySpawn[0]);

一回long型で呼んでからint型に切り替えるってわけですね。

まぁ実際は引数をint型からlong型に変えたんですけどね…
ごちゃごちゃ書くのはまどろっこしいので…

MiniJsonで敵出現の情報をまとめたい

ゲーム制作の作業で一番大切で大変なのはデータ作成と調整
でもそれができるようになる土壌の用意が必要。

というわけでどの敵がどこからいつ出現するのかをデータ管理したいと思い
データ読み込みの処理を現在作成中です。

まずデータはどのようなものが良いのか
一般的にはXMLかJson形式がよく使われます。

単に有名で例が多いということと、データを作る側がわかりやすい
という特徴のある形式です。

私は今回Jsonを使おうと思います。
Json形式の方が書き方がシンプルで使いやすいのが最大の魅力です。


で、ここからが作業の話

ぶっちゃけネットで色々と調べたのですが、
外部からJsonファイルを読み込んでUnity上で使えるように整形する
って記事はいっぱいあれど
どれも言ってることが微妙に違う!

そしてチュートリアル的な記事はそもそもJsonファイルの読み込み方が書いてない
悲しい

大体の記事はJsonをString形式で読み込んでから整形しているので
ひとまずファイルデータをString形式で読み込むところから始めようと思います。

まずはJsonファイルまでのファイルパスを取得

FileInfo jsonPath = new FileInfo(Application.dataPath + "/Scripts/Jsons/text.txt");

次にファイルの中身を全てString形式で抽出します

string json = File.ReadAllText(jsonPath.ToString());

ここで一つ注意点があります。
ReadAllTextはファイルパスをString形式で要求してきますが、
この場合のjsonPathはFileInfo形式なのでStringに変換する必要があります。

その後はIList形式に変換してデータが抽出できるところまで進みました。

IList familyList = (IList)Json.Deserialize(json);


まだ敵出現のデータとかと整合性が取れてないので要調整です。
またタブを消しておかないとバグるので注意してください。



ついでにオススメのツールを紹介します

JsonEditor
https://jsoneditoronline.org

Jsonファイルの検証・分解をしてくれるすごいやつです。


というわけで今回はここまで
また進展があったら記事を書きます。



新作ゲーム開発中

Yoke Lightが発売から一段落したので
新作ゲームの開発を始めました!

コードネームは「lagopus」
雷鳥の意味です。

名前の意味は特にないのですが、
コードネームは統一感がある名前の方が良さげなので
地球上でも種類の多い鳥類の名前にしようかと思いました。

このゲームはアクション要素の強いディフェンスゲームを目指していて
プレイヤーは飛び回って銃を打ちまくってコアを敵から守ります。

お助け要素として様々なギミックを駆使して敵を押さえることもできますが
あくまで戦うのはプレイヤー自身、タワーディフェンスではなくディフェンスアクションです。

フリーゲームの「花咲か妖精」に近い感じで
ナイフじゃなくて銃を使って防衛するイメージですかね。

で、現状の開発状況は以下の感じです

動く、飛ぶ、狙う、撃つ、食らうが現状できているので
アクションゲームとしてはひとまず形になっています。

ここからギミックを追加して敵がウェーブ毎に出るようにすることで
いい感じになっていく予定です。


で、ここからは開発の話

まず狙った所に向くというモーションをいかにして実現しているかですが、
UnityのAnimation機能を使っています。

まず上から下に向くまでの180度を180Fのアニメーションで作ります








次にキャラの中心からポインターまでの角度を出します。

MP→マウスポインタ
CenterPoint→キャラの中心

float gx = MP.transform.position.x - CenterPoint.position.x;
float gy = MP.transform.position.y - CenterPoint.position.y;
float rad = Mathf.Atan2(gy, gx);

gunAngle = rad * Mathf.Rad2Deg * -1 + 90;


最後に出てきた角度の最大を180、最小を0としてアニメーションのコマを引っ張り出せば完成

PChandAnime.Play(PChandAnimeInfo.shortNameHash, -1, gunAngle / 180);


あとはダメージ中に敵オブジェクトとの当たり判定を消す方法ですが
[Edit]→[Project Setting]→[Physics2D]
で、レイヤー同士の当たり判定を設定することができます。

ダメージ中専用のレイヤーを使って切り替えることで
レイヤーが変わっている間は敵との当たり判定が消えます・

レイヤーの変更はこんな感じ
gameObject.layer = LayerMask.NameToLayer("PlayerDamage");

調べてたら間違った方法で設定できるよと書いてる記事があったりしたので注意してね

vaganteで死んでみた

2Dアクションローグライクゲームであるvaganteを身内とやってみました。

階層を探検して敵を倒してお金を集めたりアイテムを拾ったりしていきます。
更に階層ボスを倒すことで大量のアイテムゲットもできちゃう。
ただし大量の罠、それも即死級の罠が探検を阻んできます。
そして回復要素が少ないためダメージを受けているといずれジリ貧に…。

そんな緊張感のある探検を最大4人で遊べる素敵なゲームです。

一応階層を一つ進む毎に回復ポイントも用意されていますが
初期体力が100に対して回復量は20…。

しかも味方の蘇生にも体力20使います…。
ツライ
※スクショは2人でやったときのものでゴメンね

ダンジョンはこんなふうに立体的な作りになってます。
画面中央下にあるのが即死のスパイクトラップ! こわいね!

またプレイ風景が取れたら新しくアップしていきますので

献血に肩こり解消の効果を期待して行ってきた

献血をすると血が抜けるため、
減った血液で通常の体の機能を維持するために血流量がアップするらしい。

血流量がアップすると血液の循環が良くなり
結果的に肩こりに効果があるらしいので献血に行ってきました。

献血ルームはドリンク飲み放題で快適的なことを聞いていたので期待してましたが
どちらかと言うと血を取るから水分とって倒れないようにしてくれってことらしい。
つまり飲めと言われる。

で、検査採血してから本採血。

採血用の針はぶっとくて、針の穴がよく分かるぐらいだった。
だが痛いのは刺すときだけで、採血中は別に痛くもなんともない。

基本ヒマなわけだが、初めてだからかめっちゃ看護師っぽい人に話しかけられる。
こちらとしても興味本位で来てるし、ちょっと血が吸われる感じは楽しいので悪くない。

それに暇つぶし用のテレビがベッド毎に個別でついているので全然ヒマしない。

で、採血終了後はちゃんとドリンクを飲んで帰れということでした。
あと、なんかちょっとしたものをくれるぐらい。

400ml抜いた感想としてはちょっとボーッとする。
けどそれもその日だけで次の日からは特になんともなかったです。

そしてついでに血液検査してもらえるのは嬉しい。
特にどこも悪くなく至って平均的な結果でしたが、それがわかることは良いこと。

で、結論の肩こり解消の効果についてですが
多少の効果は見込める感じですねぇ。

ぶっちゃけ筋トレするほうがいいけどね。

あと抜いた血液を作るために体がカロリー使うので
ダイエットの休憩日なんかに献血を挟むといいかもよ。
あくまで個人の感想だけどね。

Steamでゲームをリリースしてから来たCDキー要求のスパムメールリスト

Yoke LightをリリースしてからCDキーをくれっていうメールが大量に来ました。

試しにどれ位キーがほしいか聞いてみた結果、何名かは明らかに怪しい動きをしました。

他人を語って送ってきている可能性が高いメールがあったので、
備忘録と警告を兼ねてここにリストアップしていきます。

引っかかっている場合注意してください。

新しく怪しい人が確認され次第追加していきます。

※@前のみを羅列します

jdh2obusiness
tomo0723akagami

eovynaut
majorawesome1nl
ladytora93
※上記3名はTwitchからTwitterへのつながりが確認できないうえ、同時にメールを送信した所、返信が5分ズレのみで返ってくるという怪しい動きだったのでリストに載せておきます

Unityの角度取得で悩んだ話

transform.rotationで獲得できるのはラジアン角度になるので
狙い撃ちを実装するときうまくできませんでした。

transform.eulerAnglesを使うとちゃんとした角度が取得できるので
それを活用すればいろいろうまくいくと思います

あほげー参加作品「1万ニワトリ(略称)」の開発記録

あほげー第28回に参加してきました。 あほげーとは出されたお題に対して大体24時間でアホなゲームを作る企画です。 今回は2月8日に「にわとり」というお題が出され 翌9日にゲームを提出する形でした。 そしてこれが提出したゲーム 「10000円をニワトリで稼ぎたいだけの...