パスワードを忘れた? アカウント作成

過去1週間(やそれより前)のストーリは、ストーリアーカイブで確認できますよ。

14417162 journal
日記

yumeの日記: Unity制作 メデューサ・ゲーム #11

日記 by yume

●テキスト描写(会話)シーンの続き

昨日の続き。流れを改めて。
・会話が開始する
・読み上げるテキストをTextWindowに渡す
・TextWindowは毎フレーム時間を計り、0.06秒に1文字ずつ表示していく
        ・ただし、「読み上げキー」を押した場合は、テキストをすべて表示する
・テキストがすべて表示されたら、入力を待機する。
        ・読み上げキーが入力されたら、次のテキストを受け取る。

14406405 journal
日記

yumeの日記: Unity制作 メデューサ・ゲーム #10 2

日記 by yume

●テキスト描写シーン
いわゆるアドベンチャーゲーム(というかゲーム全般か)風の、下半分くらいにテキストボックスがあり、そこに3行程度のテキストが流れるあれ。
話してる人のイラストがでっかくでたらギャルゲー風かな。そんなイラストどこから用意するのかわからんけど。
まぁいいや。それで、公式曰く、UnityのUIは画面上でどういう風にスケールさせるかを決められる。
例えばボタンやテキストのサイズはそのままで、画面上の位置だけを動かすこともできれば、テキストサイズそのものを変えることもできるらしい。
だとすると、前回作ったメニューもこの比率変更に対応しなきゃな。今回のゲームはパソコン向けなので、1920x1080を基準に考えていく。

14397031 journal
日記

yumeの日記: Unity制作 メデューサ・ゲーム #9 2

日記 by yume

●タイトル画面

タイトル画面と言っても、とりあえずは「なんかキーを押したらゲームが始まる画面」でよい。
一応タイトル画面であることがわかるように、仮のタイトルロゴを入れておく。実際にタイトルロゴを使うかは未定。
とにかくなんでも入力したらゲームスタート(現状はいきなりStage 1から始まる)
後々ここでやりたいこともあるが、一旦OK

--

●ESCキーでメニュー画面。あと一時停止

ESCキーを押すと:
・音量調整
・ゲーム終了
みたいなのが出るといい。
現状は音もないから、とりあえずはゲーム終了だけがあればいいが、仮のメニューも作っておこう。
メニューの外枠が必要だが、枠のサイズごとにでかいスプライトを作ってたら大変だな。
たぶん9スライスみたいな機能があるだろう。探したらバッチリある。

14393794 journal
日記

yumeの日記: Unity制作 メデューサ・ゲーム #8

日記 by yume

●捕獲システム
昨日の続き。
テストAIで経路探索は成功したので、
・兵士がRaycastでメデューサを見つける
・見つけたら「発見状態」で経路探索開始
とつなげて、兵士の発見・経路探索は完成。

--

●ステージ

ゲームオーバー処理はデバッグメッセージになってるので、ゲームオーバー処理を作る。

……の前に、まずは「ステージ」という概念を作ったほうがよさそうだ。
Unityにはすでに「シーン」という概念があるので、これを使ってみよう。
まずはさっと調べてみる。

14389080 journal
日記

yumeの日記: Unity制作 メデューサ・ゲーム #7

日記 by yume

●メデューサ移動システム
現状はマウスクリックしたポイントに向かってvelocityを決めて、フレームごとに徐々にそこに近づいていく、という方式だが
少し変えて「マウスをクリックしている間、マウスカーソルへ向かう」という方式にする

private void MoveTowardAim()
{
        towardPosition = aimPosition - myBody.position;
        towardPosition = towardPosition.normalized;
        myBody.velocity = towardPosition * speed;
}

●捕獲システム
兵士がメデューサを捕捉し、近づいて、捕獲するまでの動作。

14382334 journal
日記

yumeの日記: Unity制作 メデューサ・ゲーム #6

日記 by yume

●乗算

可視領域ポリゴンを、一旦乗算ブレンドにしておく。
公式曰く、
・Blend DstColor Zero // 乗算

うーん、うまくいかないな。Photoshop上でテストしたやつよりもずっと暗いし、何より下のやつが全部消えてる。
一方、Unityのビルトインシェーダー「Legacy Shaders/Particles/Multiplyだとうまくいく。
公式より、ビルトインシェーダーをダウンロードできるらしい。
これをいじってみよう……と思ったが、あまりにもわからない要素が多すぎる。
このシェーダーはパーティクル用らしい。それでも動くならいいか、とも思ったがもう少し調べよう。

14340324 journal
日記

yumeの日記: Unity制作 メデューサ・ゲーム #5

日記 by yume

●メデューサ・ゲーム

●Unityのバージョン

テキトーに最新版2020.1.4f1を使っていたが、長期サポートの対象はLTSバージョンである2019.4.9f1だから、ゲームをリリースするつもりならそっちのほうがよいらしい。
まだ要素も少ないので、一旦新しいプロジェクトをLTSバージョンで作り、そっちにインポートしておく。

って、引っ越したらすぐに2019.4.10f1が来たぞ……。でもマイナーバージョンアップは問題ないらしい。

--

●視界マスク

視界に入っているものは普通に描画し、視界外のものは描画処理を変えるやつを作りたい。
例えば、視界内は普通に表示して、視界外は真っ黒、とか任意のスプライトで覆うとかそういうの。
とは言ったものの、実際どうすればいいのか見当つかず。

14334820 journal
日記

yumeの日記: Unity制作 メデューサ・ゲーム #4 1

日記 by yume

●メデューサ・ゲーム
昨日の続き。

公式曰く、
・Mesh.Clear()でメッシュの情報を削除する
・このメソッドにfalseを渡して実行しないと、頂点レイアウト(Triangles)は削除しない
そもそもMesh.Clearはしていなかった(Meshに頂点座標とレイアウトは毎フレーム新たに渡していたので)が、このメソッドを頭につけるとうまく動くようになった。

これでエラーは消えたが、まだ問題は残る。左向き問題だ。
現状では、プレイヤー原点から左はRadianでいうと-π/πの境界線になっている。
以前の360度メッシュの場合、この境界線をまたぐ頂点(一番最初の頂点と、一番最後の頂点)をつなぐことで、一周させていた。

14330637 journal
日記

yumeの日記: Unity制作 メデューサ・ゲーム #3

日記 by yume

●メデューサ・ゲーム

●メデューサの視野角を制限する
メデューサは現状では、360度の視野角(計算的には-π~π)を持っている。これを「前を向いているなら、後ろは見えない」というように、数値によって制限された視野角にしたい。
流れとしては:
・弧度viewingAngleを持っておく
・マウスポジションから2D座標aimPositionをとる
・aimPositionに対する弧度をとる(-π~+π)

え~と、それから……。

既存のFOVメソッドでは:
・ポリゴン頂点に向かって弧度goalRadianをとる
・goalRadianに向かってRaycastする
という仕組みなので、このRaycastする前に、goalRadianが「視野角内か」を判定し、視野角外なら無視すればよいはず。

14328669 journal
日記

yumeの日記: Unity制作 メデューサ・ゲーム #2 1

日記 by yume

●補習
昨日のコレだが:

public int playerLayer = 9;
int layerMask = ~(1 << playerLayer); //Exclude layer 9

++C++;曰く、

・<<は左シフト(これはまぁ覚えてた)
・~は補数
例えば二進数000111の0と1を逆転し、111000にする。

14320905 journal
日記

yumeの日記: Unity制作 メデューサ・ゲーム #1

日記 by yume

●メデューサ・ゲーム

寝る前に簡単にゲームのルールを考えた:
・ゲームは2Dで、上から俯瞰したような(見取り図のような)視点、または疑似的な角度のついた(クロノ・トリガーみたいな)視点。
・ステージ上にはメデューサ(プレイヤー)、兵士、猫、壁がある。
・メデューサは:
        ・2次元の視界を持つ。視界は壁によってさえぎられる(前回までに作ったもの)
        ・マウスクリックで目標点を指定し、そこまで一定の速度で歩く。
        ・視界に兵士か猫を3秒間入れ続けると、それを「石化」させる。

14316600 journal
日記

yumeの日記: Unity学習 #10 2D Visibility 完成

日記 by yume

2D Visibility

●可視領域多角形の角度をとる。角度を基準に頂点をソートする

必要な頂点の座標はすべて取れたが、
プレイヤーを原点としたこの座標に対する角度を得る必要がある。
その前に、まずそのためのクラスを作っておく。

public class VisibleVertex
{
        //可視多角形領域の頂点とプレイヤーからの角度
        public float Radian;
        public Vector2 EndPoint;

14313661 journal
日記

yumeの日記: Unity学習 #9 2D Visibility

日記 by yume

2D Visibility

●頂点座標のその先

これまでの作業で、
・各ポリゴンの頂点座標
・プレイヤーと頂点座標を結ぶ線上の、ポリゴンとの衝突点
をとることはできたが、もう一種
・頂点座標からさらに進んだ先の、衝突座標
が必要だ。

考え方としては
・ある頂点を目指してRayを投げたとき:
        ・Rayが頂点まで到達できない場合は、その地点をReturn
        ・Rayが頂点まで到達した場合は、その点と、さらに
        そのRayをColliderにぶつかるまでまっすぐ伸ばし、ぶつかった地点をReturn
        (頂点に到達した時点で、そこが終着点になる場合もある)

14310278 journal
日記

yumeの日記: Unity学習 #8 2D Visibility 2

日記 by yume

2D Visibility

●頂点の数を数えて、座標をとる。

・Start関数ですべてのPolyWallから、頂点座標リストpolyPointsを取得する。
・他のGameObjectを探すにはいくつか方法があるが、tagをもとに複数のGameObjectを探す場合は GameObject.FindGameObjectWithTag(string tag);
例えば"PolyWall"タグのオブジェクトを探すなら
GameObject[] polyWalls = GameObject.FindGameObjectsWithTag("PolyWall");
のようにする。

14307184 journal
日記

yumeの日記: Unity学習 #7 2D Visibility

日記 by yume

2D Visibility

●難題
ncaseの続きをやるが、数式が出てきたところでお手上げになってしまった。
Ray X = r_px+r_dx*T1
Ray Y = r_py+r_dy*T1
Segment X = s_px+s_dx*T2
Segment Y = s_py+s_dy*T2
とあるが、r_pxとは何か、r_dxとは何か、角度をとるのはdegreeでいいのか、さっぱりわからない。
しかもこの数式の次のステップでは、もう交差点をとれてる。えー。

うーむ。なにはともあれ、二つの線分が交差したら、その交差点を座標として取得しなければ。
線分Aはプレイヤーからマウスまで伸びるRay。
線分Bはあるポリゴンの一辺とするSegment。ここまではいい。もっと調べてみよう。

typodupeerror

あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall

読み込み中...