LoginSignup
akatuki2121332
@akatuki2121332 (ビノ)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Unityでオブジェクト同士の距離が近いほど数値を大きくする式を作りたいです。

Unityでオブジェクト同士の距離が近いほど数値を大きくする式を作りたいです。

現在の処理

    [SerializeField] private GameObject player;
    [SerializeField] private GameObject enemy;
    Vector3 playerPos;
    Vector3 enemyPos;
    public float distance;
    void Start()
    {
        player = GameObject.Find("Player");
        enemy = GameObject.Find("Enemy");
        playerPos = player.transform.position;
        enemyPos = enemy.transform.position;
        distance = Vector3.Distance(playerPos,enemyPos);
    }

    void Update()
    {
        playerPos = player.transform.position;
        enemyPos = enemy.transform.position;
        distance = Vector3.Distance(playerPos, enemyPos);
    }

この処理で距離を測ることができますが、この場合だと距離が近づくにつれて数値が小さく、離れるにつれて大きくなってしまいます。

スクリーンショット (438).png

こちらの赤いオブジェクト"Player"と黄色いオブジェクト"Enemy"の距離が近づくにつれて数字を大きく、離れるにつれて数字を小さくしたいです。
可能ならば1~100のように数字の葉にも指定できればと考えております。
よろしければご教示お願い致します。

0

3Answer


using UnityEngine;

public class DistanceCount : MonoBehaviour
{

    [SerializeField] private GameObject player;
    [SerializeField] private GameObject enemy;
    private Vector3 playerPos;
    private Vector3 enemyPos;
    public float distance { get; private set; }

    [SerializeField]
    private float maxDistance = 100f;// 想定される最大距離(マップが無限に広いということはないはずなので)
    private void Start()
    {
        if (!player)
            player = GameObject.Find("Player");

        if (!enemy)
            enemy = GameObject.Find("Enemy");

        if (!player && !enemy)
            return;

        playerPos = player.transform.position;
        enemyPos = enemy.transform.position;
        distance = Vector3.Distance(playerPos, enemyPos);
    }

    void Update()
    {
        playerPos = player.transform.position;
        enemyPos = enemy.transform.position;
        distance = Vector3.Distance(playerPos, enemyPos);

        if (distance > maxDistance)
        {
            Debug.Log("マップの外に出てます");
        }
        Debug.Log(maxDistance  - distance / maxDistance  * maxDistance );//相対距離を0~100で定義する

    }
}

この手のプログラムだと想定される最大距離を定義した方が作りやすいと思います
ぼくならこんな感じでやるかなあ

1

Comments

  1. @akatuki2121332

    Questioner
    ありがとうございます!参考になります。

計算量的に一番楽なのは「距離に-1をかける」です。
一定の範囲内の値にしたいのであれば、@stf-unitys さんも書かれているように最大の距離がどれくらいかを考える必要があります。
そしていろいろな計算に使うことを考えると、範囲は0.0から1.0としておくと使い勝手がいいです。
1-(距離/最大距離)

またゲームなどであれば重力などの係数になる「距離の逆二乗」の方が自然なときもあります。(距離が近づくほど急激に大きくなる)
この場合は距離の計算に必要な平方根が不要になるため、計算量も少なくなります。

//距離の2乗を取得。unityが専用のプロパティを用意するほど需要があるということです
float sqrLen = (playerPos - enemyPos).sqrMagnitude;
//距離0は無限大とするしかない
float inverseSquare = (sqrLen != 0.0) ? 1 / sqrLen : float.PositiveInfinity;
1

Comments

  1. @akatuki2121332

    Questioner
    回答ありがとうございます。参考にいたします。
This answer has been deleted for violation of our Terms of Service.

Your answer might help someone💌