Вторник, 16 Апреля 2024, 17:11

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Расстояние между объектами
Расстояние между объектами
q1w287Дата: Вторник, 05 Апреля 2016, 13:56 | Сообщение # 1
частый гость
Сейчас нет на сайте
Подскажите как Unity определяет расстояние.
Определяю таким способом:
Код
float dist = (player.position - mushrums.position).sqrMagnitude;
, некоторые объекты в игре.
Но в результате получаю странные значения. Объект около которого находится игрок имеет гораздо большее значение чем объект который далеко от игрока, если смотреть по сцене. Пространство изометрическое, не 3d.


Сообщение отредактировал q1w287 - Вторник, 05 Апреля 2016, 13:57
Jlovenpk1Дата: Вторник, 05 Апреля 2016, 14:19 | Сообщение # 2
участник
Сейчас нет на сайте
Логика работы:
- Персонаж смотри на объект.
- определяется дистанция.
- Выполняются действия.
В твоем случае, ray каст есть?


DjanStudio
BizzyДата: Вторник, 05 Апреля 2016, 15:02 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
Ох, читаем, http://docs.unity3d.com/ScriptReference/Vector2.Distance.html

q1w287Дата: Вторник, 05 Апреля 2016, 15:03 | Сообщение # 4
частый гость
Сейчас нет на сайте
Цитата Jlovenpk1 ()
Логика работы:
- Персонаж смотри на объект.
- определяется дистанция.
- Выполняются действия.
В твоем случае, ray каст есть?

нет, рейкаста нет. Не совсем понимаю для чего он здесь.
MANMANAДата: Вторник, 05 Апреля 2016, 15:22 | Сообщение # 5
почти ветеран
Сейчас нет на сайте
Цитата q1w287 ()
нет, рейкаста нет. Не совсем понимаю для чего он здесь.

Таки Jlovenpk1 какбэ намекает, что при помощи рейкаста можно узнать расстояние до объекта (точнее до его коллайдера)
Код
using UnityEngine;

public class RaycastExample : MonoBehaviour
{
    public Missile missile;

    void FixedUpdate()
    {
        RaycastHit hit;

        if (Physics.Raycast(transform.position, -Vector3.up, out hit))
            print("Found an object - distance: " + hit.distance);
    }
}

Physics.Raycast


http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг
VKонтакте 3Dbuffer

Последнее:

Новый раздел "Текстуры"

Как запатентовать, защитить техническое решение, игру, идею
falcowareДата: Вторник, 05 Апреля 2016, 15:34 | Сообщение # 6
старожил
Сейчас нет на сайте
q1w287, dist = sqrt((x1 - x2) ^ 2 + (y1 - y2) ^ 2 + (z1 - z2) ^ 2); wink
irinautkinaДата: Вторник, 05 Апреля 2016, 18:01 | Сообщение # 7
участник
Сейчас нет на сайте
В Unity для Vector2 и Vector3 есть функция Vector3.Distance(Vector3 a, Vector3 b); - возвращает float дистанцию между объектами biggrin
q1w287Дата: Среда, 06 Апреля 2016, 15:24 | Сообщение # 8
частый гость
Сейчас нет на сайте
Bizzy, irinautkina, vector2.distance - измеряет некорректно
MANMANA, не понял как это приладить в моем случае, вот есть игрок и надо мерить расстояние до нескольких объектов
сейчас сделал так
Код
float dist = Vector2.Distance(player.position, mushrums.position);
  float distInv = Vector2.Distance(mushrumsInv.position, player.position);
  float distRun = Vector2.Distance(player.position, fastRun.position);
  float distFear = Vector2.Distance(player.position, beastFear.position);

вот как здесь использовать raycast?
falcowareДата: Среда, 06 Апреля 2016, 15:29 | Сообщение # 9
старожил
Сейчас нет на сайте
q1w287, могу ошибаться, но Vector2 имеет всего 2 координаты х и у. Вы уверены, что Вам это нужно?
q1w287Дата: Среда, 06 Апреля 2016, 15:55 | Сообщение # 10
частый гость
Сейчас нет на сайте
falcoware, у меня не 3d, с vector3 ничего не меняется
BizzyДата: Среда, 06 Апреля 2016, 16:42 | Сообщение # 11
постоянный участник
Сейчас нет на сайте
q1w287,
Цитата q1w287 ()
vector2.distance - измеряет некорректно

Поподробней в студию.


q1w287Дата: Среда, 06 Апреля 2016, 16:59 | Сообщение # 12
частый гость
Сейчас нет на сайте
Bizzy,
Код

public Transform player;
public Transform mushrums;
public Transform mushrumsInv;

float dist = Vector2.Distance(player.position, mushrums.position);
float distInv = Vector2.Distance(player.position, mushrumsInv.position);

Debug.Log(dist);
Debug.Log(distInv);
  


по логу до mushrums расстояние - 66.52308 (dist)
до mushrumsInv расстояние - 26.24836 (distInv)
может я что-то не понимаю...


Сообщение отредактировал q1w287 - Среда, 06 Апреля 2016, 17:00
falcowareДата: Среда, 06 Апреля 2016, 17:06 | Сообщение # 13
старожил
Сейчас нет на сайте
q1w287, похоже проблема в том, что координаты абсолютные. Может тебе еще надо умножить на матрицу поворота?
BizzyДата: Среда, 06 Апреля 2016, 19:12 | Сообщение # 14
постоянный участник
Сейчас нет на сайте
q1w287, Вот проверил, у меня все работает отлично. Единственное что могу предположить что у тебя плоскость находится в координатах X-Z. Если это верно то считать расстояние наверно нужно так:
Код

float dist = Vector2.Distance(new Vector2(player.position.x, player.position.z), new Vector2(mushrums.position.x, mushrums.position.z));


berilДата: Среда, 06 Апреля 2016, 20:23 | Сообщение # 15
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Ответ уже дали vector3.Distance

Цитата q1w287 ()
float dist = (player.position - mushrums.position).sqrMagnitude;

Это не длина вектора, это квадрат длины.
Если нужно найти расстояние таким образом то используй float dist = (player.position - mushrums.position).magnitude;
собственно vector3.Distance(player.position, mushrums.position) одно и тоже что и (player.position - mushrums.position).magnitude только менее оптимизировано

Код
     public static float Distance(Vector3 a, Vector3 b)
     {
         Vector3 vector = new Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
         return Mathf.Sqrt(vector.x * vector.x + vector.y * vector.y + vector.z * vector.z);
     }


Код
     public static float SqrMagnitude(Vector3 a)
     {
         return a.x * a.x + a.y * a.y + a.z * a.z;
     }


Код
     public static float Magnitude(Vector3 a)
     {
         return Mathf.Sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
     }




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
q1w287Дата: Четверг, 07 Апреля 2016, 11:54 | Сообщение # 16
частый гость
Сейчас нет на сайте
Bizzy, да плоскость в x-z, поменял результат тот же, удаленный объект ближе чем около которого игрок. Вообще второй объект берется из префаба, и перемещается по разным точкам на карте, а расстояние всегда одно и то же. Может причина в том что это префаб?

Сообщение отредактировал q1w287 - Четверг, 07 Апреля 2016, 11:55
BizzyДата: Четверг, 07 Апреля 2016, 12:31 | Сообщение # 17
постоянный участник
Сейчас нет на сайте
q1w287, А может по тому что ты берешь не те объекты? Может сам объект стоит на месте а дочерний объект двигается(в общем координаты дочернего объекта не 0,0,0)?

q1w287Дата: Четверг, 07 Апреля 2016, 13:34 | Сообщение # 18
частый гость
Сейчас нет на сайте
Цитата Bizzy ()
q1w287, А может по тому что ты берешь не те объекты? Может сам объект стоит на месте а дочерний объект двигается(в общем координаты дочернего объекта не 0,0,0)?

Получается что игрок двигается, первый объект(mushrums) не двигается, а второй(mushrumsInv) берется из префаба (изначально объекта нет) и меняет свое местоположение вот таким скриптом:
Код


public class spawnItems : MonoBehaviour {

    public Transform[] SpawnPoints;
    public float SpawnTime=4.0f;
    public GameObject StealthMush;

    // Use this for initialization
    void Start () {
  InvokeRepeating ("SpawnMush",SpawnTime,SpawnTime);
    }
    
    // Update is called once per frame
    void Update () {
    
    }
    public void Stop() { CancelInvoke("SpawnMush"); }
    public void SpawnMush()
    {
  int spawnIndex = Random.Range (0,SpawnPoints.Length);
  Instantiate (StealthMush,SpawnPoints[spawnIndex].position, SpawnPoints[spawnIndex].rotation);
    }
}
falcowareДата: Четверг, 07 Апреля 2016, 13:45 | Сообщение # 19
старожил
Сейчас нет на сайте
q1w287, ну выведите позицию и посмотрите соответствует она действительности или нет? В чем проблема? wacko
BizzyДата: Четверг, 07 Апреля 2016, 13:58 | Сообщение # 20
постоянный участник
Сейчас нет на сайте
q1w287, Он не меняет свою позицию, он создает объект.

Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Расстояние между объектами
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг