| Расстояние между объектами | 
|  | 
| 
| 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, Он не меняет свою позицию, он создает объект. 
 
   |  |  |  |  |