Расстояние между объектами
|
|
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);
|
|
| |
irinautkina | Дата: Вторник, 05 Апреля 2016, 18:01 | Сообщение # 7 |
участник
Сейчас нет на сайте
| В Unity для Vector2 и Vector3 есть функция Vector3.Distance(Vector3 a, Vector3 b); - возвращает float дистанцию между объектами
|
|
| |
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, ну выведите позицию и посмотрите соответствует она действительности или нет? В чем проблема?
|
|
| |
Bizzy | Дата: Четверг, 07 Апреля 2016, 13:58 | Сообщение # 20 |
постоянный участник
Сейчас нет на сайте
| q1w287, Он не меняет свою позицию, он создает объект.
|
|
| |