忍者ブログ

素人ゲーム開発を垂れ流しつつ、覚醒に至るまでの記録や役立ち情報、愚痴を書くブログ。ちなみに前立腺の開発もやっている。

カテゴリー「自作ゲーム」の記事一覧
ゲーム開発でもバリバリ役に立ちます。
コーディングに詰んだりした時や、ネット検索でどう
検索していいかわからないときにかなり強みになるでしょう。
そして時短につながります。



以下GPTのやり取りを一部載せておきます↡

 

それに対してのGPTの返答↡

OK、やりたいことは明確
2Dで2点間の距離(長さ)を求めて、一番近いオブジェクトを選びたいね。


基本:2点間の距離を求める

Vector2 obj1;
Vector2 obj2;
 
float distance = Vector2.Distance(obj1, obj2);

これでOK。
内部的には √(x² + y²) をやってくれる。


でも「一番近いもの」を探すなら最適化した方がいい

距離比較だけなら 平方根は不要

Vector2.Distance() は √ を使うので少し重い。
比較だけなら sqrMagnitude を使うのが定石。

Vector2 diff = obj1 - obj2;
float sqrDistance = diff.sqrMagnitude;

または一発で:

float sqrDistance = (obj1 - obj2).sqrMagnitude;

これは √ を使わないので高速。


複数オブジェクトから一番近いものを選ぶ例

public Transform GetNearest(Transform origin, Transform[] targets)
{
    Transform nearest = null;
    float minSqrDistance = Mathf.Infinity;
 
    Vector2 originPos = origin.position;
 
    foreach (Transform target in targets)
    {
        Vector2 targetPos = target.position;
 
        float sqrDist = (originPos - targetPos).sqrMagnitude;
 
        if (sqrDist < minSqrDistance)
        {
            minSqrDistance = sqrDist;
            nearest = target;
        }
    }
 
    return nearest;
}

ポイントまとめ

  • 距離を知りたい → Vector2.Distance

  • 比較したいだけ → sqrMagnitude

  • Mathf.Sqrt は基本避ける(比較用途では不要)


さらに高速にするなら

大量にある場合:

  • 事前に検索半径でフィルタ(Physics2D.OverlapCircle など)

  • 空間分割(QuadTree)

  • DOTS系


今作ってるのは

  • 敵AIのターゲット選択?

  • 弾のホーミング?

  • UIロックオン?

用途によって最適解ちょっと変わるよ。
どのタイプ?


以上チャットGPT-----------------------↑↑↑



数秒で返ってきます。是非、個人やチームで開発している
方がいらしたら使ってみることをお勧めします。かなり時短です。
そして思いもよらない小技をぽろっと言ってきたりもします。

PR



オッサンほいほい、西部劇。
20代前半に買った「夕日のガンマン」DVD版。
何で買ったか覚えてないけど当時メルカリは使ってなかったと
思うのでどこか店頭で買った気がします。

祖父が映画好きでリビングでは西部劇がよく流れていました。
当然子供の頃は汚らしい髭づらのおっさん達がむさ苦しい汗を
垂らしながら繰り広げられるしょーもない薄っぺらいストーリー
にあまり興味がありませんでした。


 


何がきっかけだったか、当時簡単な言語でFPSを創っているときに
このDVDを見て「SAA」のカッコよさを知った気がします。
ブラックパウダーによる銃口からの煙がカッコいいんですよね。

これはゲームに追加したい要素と言う事でゲーム内に登場させて
行きたいと思います。ソレっぽく描いてみました。ハッタリですが、まぁこれでいいでしょう。





 


ダブルバレルも追加で。
ソウドオフとロングの2種類を用意してみました。
FPSでダブルバレルショットガンを初めて使ったのは
ゲームボーイアドバンス版DOOM2だったと思います。
この時期はあまり良さを感じませんでしたが決定的だったのは
KillinFloorのサポートスペシャリストのアレでした。

オルトファイアでぶっ飛ぶスペシメン達に脳汁が出たのを覚えています。
友達も何もいない、寂しい思い出です(笑)




 


とりあえずテスト用にロックオン(今では死語?)出来る「敵」
を2つ用意し、OnTriggerStay2DOnTriggerEnter2DOntriggerExit2D
駆使して複数重なったターゲットで最も近い敵をロックできるシステムを構築したい。


BoxCollider2DRigidBody2Dを使う事でスマートではないが
簡単に当たり判定は取得可能。当たった場合上のOnTrigger系が呼ばれるので
この3つを使って何とか実現できそう。1つの空オブジェの子として2つのレティクル用オブジェ
を作成、この階層と並列にBoxColliderを設置。レティクル側と敵側の2種類にBoxColliderを。

RigidBodyはレティクル側に付け、物理処理は「重め」の常時作動に。
この設定をしなければRigidBody搭載オブジェが静止した時にOnTrigger系が呼ばれないので
常時動かす必要がある。それだとうまく使えないのでこの設定はONが条件。




いろいろ考えたがもっと簡単な方法があった。
そしてこのデバック機能は本当に便利で、問題があった時に一時停止してくれて
変数1つ1つにどのタイミングで何が入っているかが分かるので非常に助かる。

謎の挙動をした時はこれが一番確実と思われる。



現在のレティクルがロックオン可能のオブジェに何個当たっているか?
と言う判定は、ヒット数カウント変数を作りそこに
Enterが呼ばれた時に+1
Exitが呼ばれたときに1を代入することで取得できた。


後はオブジェを格納するLIST変数を用意しヒット毎(Enter)に呼ばれたら
ヒットしたObjectを格納。Exitで離れた場合ヒットしたObjectDeletすれば
絶賛当たっているObjectだけが格納される変数の出来上がり。(のはず)


このList変数に入っていると言う事は当然現在当たっているObjectのみ
なので、ティクルの中心地から一番近いターゲットを割り出せば
上手い事ロックオンマーカーが意図したターゲットに付けられるはず。



でも今日はいい時間なので寝ることにする。
試験的に色分けしてみましたが、見にくいかもしれません。
どうですかね。















1日手をつけずfar cry2をプレイする日でありました。その前日はボックスコライダーヒット中のオブジェクトをカウントするスクリプトを書きました。






trigger stayが呼ばれない時用のカウンターを作りましたが、Updade()とは独立して呼ばれるtrigger系がフレームレート的に低い為この方法だとtrigger stayでisHit的な判定用Bool変数を作ってもtrigger系が呼ばれなかった場合上書きされずにfalseに…


stayよりもEnterで判定用変数に1プラスし、Exitで1マイナスにすることで当たってるオブジェが簡単に取得できる事をある記事で知りました。これは便利。
あとはlistにEnterヒットしたオブジェを入れて行き、Exitの時にヒットしてるオブジェとlistに入れたオブジェが一致してたらそいつをリストから消せばヒット中のオブジェクトのみがlistに入ってることになりますね!


後はその残りのlistのオブジェクトの座標を全て調べて照準のセンター座標から1番近い方を割り出せば上手くロックオンマーカーの表示すべきオブジェクトがわかりそうです。


面倒なので今日は取り敢えず寝ますzzZ



Input.MousePositon」はマウスの座標を取得できます。
しかし最近のUnityでは旧式の「InputManager」を推奨していません。
残念ながらInput.系はこの旧式のInputManagerです。



新型のInputSystemのみを使う場合は使えないのですね。
設定でInputManagerとInputSystemの併用が可能ですが
僕の環境だとマウスを動かした途端InputSystem側の操作が
うまく作動しなくなり「操作不可能」になる場面がありました。


InputSystemは非常に便利でアクション1つに複数の周辺機器を登録でき
、Xbox系だろうがPlayStation系だろうが纏めることが出来るため、
出来ればInputSystemを使いたい所。しかし面白い事に主流になった今でも
マウス座標の取得は







// マウス座標取得
Input.MousePosition





といろんなブログなどで見かけます。




これはこの競合を避ける為にInputSystemのみ使用する設定にすると当然ながら
使えなくなります。エラーを吐きます。



この場合は



Mouse.current.position.ReadValue()





コチラを使う事で回避できました。
まだよくわかってませんがとりあえず行けたのでここに記録しておきます。



参考にさせていただいたサイト↡
https://teratail.com/questions/348893
  
ブログ内検索
最新コメント
[01/01 FrankSeita]
[10/06 ダージリン]
[10/03 ゼン]
[10/01 ダージリン]
[09/25 ゼン]
プロフィール
HN:
kawaハギ
年齢:
36
性別:
男性
誕生日:
1989/07/03
職業:
無職
趣味:
ゲーム 音楽
自己紹介:
人類を5次元意識へ押しあげる為のゲームを
開発しています。

小学生3年頃から鬱を発症。対人恐怖症、醜形恐怖等で引きこもり。
生きる意味を長らく探し求め、ようやく答えを見つけスピリチュアル
にたどり着く。覚醒を数段階体験し現在は”もう一度”物理的な自立を目指しています。
カウンター
Copyright ©  -- 覚醒できるゲームを作るブログ --  All Rights Reserved

Design by CriCri / Material by petit sozai emi / powered by NINJA TOOLS / 忍者ブログ / [PR]