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

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

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

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

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

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

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人でやったときのものでゴメンね

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

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

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

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