Четверг, 25 Апреля 2024, 10:56

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Форум игроделов » Записи участника » polous [43]
Результаты поиска
polousДата: Суббота, 23 Августа 2014, 19:34 | Сообщение # 21 | Тема: Выделение ГО
частый гость
Сейчас нет на сайте
MANMANA, Artaniel, спасибо огромное! советы работают, код в последнем посте делает все, что мне хотелось, НО! Почему я написал о бул массиве - дело в том, что если придерживаться той логики, которую Artaniel изобразил в посте выше, то враг, если его видит хоть один из игроков, он виден для всех игроков... т.е. у него true и всё тут. Но ведь в игре будут ситуации, когда игрок видит один набор врагов, а другой игрок - других и при переходе от одного игрока к другому рендериться должны только те, что попадают в FOV текущего игрока (выбранного). Т.е. я это представляю себе так, что для каждого плеера должен быть отдельный обновляемый покадрово набор FOVов по каждому врагу. Это я, конечно, наперед забегаю, потому как сейчас нет никакого выделения игроков, а следовательно скрипт, представленный выше - это именно то, что я хотел. Хотя мне вскоре предстоит столкнуться с описанной проблемой, когда будет выбор игроков реализован.

Добавлено (23.08.2014, 19:34)
---------------------------------------------
итак, все-таки поднимаю этот вопрос. Например, есть 2 игрока и 2 врага. Один игрок "видит" сразу двоих, а другой только одного. Согласно последнему скрипту все враги будут видимы, тк скрипт для врагов сохраняет либо тру, либо фолс, и тк цикл по всем игрокам дает инфу, что по совокупности все враги в поле зрения, то у каждого из них тру. Нужно реализовать более сложный вариант, где у бота может быть тру для одного, но фолс для другого. Есть идеи? Все-таки бул массив или как-то иначе? просто совет/подсказку/наводку, весь скрипт писать не нужно)) а то вы так за меня всю игру напишете happy

polousДата: Пятница, 22 Августа 2014, 22:36 | Сообщение # 22 | Тема: Выделение ГО
частый гость
Сейчас нет на сайте
Эх-ох, новые трудности

все та же сцена, на ней боты-игроки и боты-враги. У игроков есть область видимости. Если враг попал туда - виден, вне области - невиден. Когда в сцене один бот-игрок, я пробегаю по всем врагам и если кто-то попал в FOV, то он виден - все ок. Когда я добавляю цикл по всем игрокам, чтоб делали тоже самое, исполняет функцию поиска только последний в массиве бот-игрок. И я вообщем-то понимаю, что так и должно быть, т.к. вся инфа для предыдущих ботов-игроков затирается новой инфой для следующего в цикле бота-игрока... я это понимаю, но как организовать циклы, чтоб было так, как хочу, я не знаю... а хочется мне, чтоб у каждого бота-игрока был FOV, т.е. если один видит врага, то это не значит, что видит другой и тп... подскажете как исправить ситуацию?

Привожу текст скриптов. Все лишнее убрал, чтоб легко можно было ориентироваться в проблеме. Первый скрипт с массивом игроков и врагов, к которому буду обращаться во втором скрипте, в котором метод с поиском врагов
Код

using UnityEngine;
using System.Collections;

public class GameManager : MonoBehaviour {
      public static GameObject[] enemies;
      public static GameObject[] players;

      void Start () {
       enemies = GameObject.FindGameObjectsWithTag("Enemies");
       players = GameObject.FindGameObjectsWithTag("Players");
      }

      void Update () {
       GetComponent<FindEnemies>().EnemyFinder();
      }
}


второй скрипт
Код

using UnityEngine;
using System.Collections;

public class FindEnemies : MonoBehaviour {
      float distance;
      float angle;
      bool inFOV;

      public void EnemyFinder(){

       foreach (GameObject p in GameManager.players) {

        foreach (GameObject e in GameManager.enemies) {

         distance = Vector3.Distance (p.transform.position, e.transform.position);
         angle = Vector3.Angle (p.transform.forward, e.transform.position - p.transform.position);

         if (angle < p.GetComponent<Player>().aov & (int) distance < (p.GetComponent<Player>().dov) ) {
          inFOV = true;
         }
         else {
          inFOV = false;
         }
             

         if (inFOV) {
          e.renderer.enabled = true;
         }
         else {
          e.renderer.enabled = false;
         }
        }
       }
      }
}



Добавлено (22.08.2014, 21:20)
---------------------------------------------
может создать бул переменную для игрока, в которую будет сохраняться true, если враг попал в фов, тогда она не будет затираться.... unsure

Добавлено (22.08.2014, 21:36)
---------------------------------------------
наверное, даже нужно сделать 2д массив булов из колврагов х колигроков


Сообщение отредактировал polous - Пятница, 22 Августа 2014, 22:38
polousДата: Пятница, 22 Августа 2014, 15:25 | Сообщение # 23 | Тема: Выделение ГО
частый гость
Сейчас нет на сайте
=) удивительно, но я совсем недавно открыл это желание) оказалось, что программировать очень увлекательно, сложно и интересно - крайне творческая работа - куча задач, которые могут решаться чуть ли не бесконечным числом способов! - это офигенно! Тем не менее, ты всегда будешь опытнее (при то же условии, что тебя не покинет желание познавать новое и создавать что-то ;)) и это хорошо, потому как учиться опыту у более опытных - наиболее верный вариант, спасибо, что помогаешь) ты хороший учитель
polousДата: Пятница, 22 Августа 2014, 13:42 | Сообщение # 24 | Тема: Выделение ГО
частый гость
Сейчас нет на сайте
ниче-ниче, однажды я дорасту до твоего уровня, MANMANA)) Спасибо тебе, который раз даешь бесценные советы) буду пробовать
polousДата: Пятница, 22 Августа 2014, 12:54 | Сообщение # 25 | Тема: Выделение ГО
частый гость
Сейчас нет на сайте
Ок, спасибо за ответ, MANMANA!
Сразу возникает следующий вопрос (на понимание) - игра предполагается пошаговой, т.е. игрок первый потратил очки действия и ход переходит к следующему игроку. Вариант выбора по клику мышки мы обсудили выше. И ты предлагаешь выбирать по ID. Но ведь если реализовывать переход хода от одного к другому, когда кончились очки действия, то по ID не получится (я предполагаю). И здесь логичнее сделать массив и последовательно переходить от одного компонента массива (игрока) к другому, верно? Если это так, то
1) как сделать массив из уже созданных в сцене объектов?
2) как с помощью рейкаста у объектов в массиве с одинаковым тэгом узнавать их номер в массиве? ... хотя, видимо, и тут их можно по ID отличать
polousДата: Пятница, 22 Августа 2014, 11:32 | Сообщение # 26 | Тема: Выделение ГО
частый гость
Сейчас нет на сайте
Ребята, вновь порция нубских вопросов, не обессудьте)

В сцене есть объекты - игроки, например, с тэгом "players". На данном нулевом этапе был создан примитив и на нем лежит скрипт Player и FindEnemy, который ищет врагов в поле зрения игрока. Методы скрипта FindEnemy запускаются в скрипте Player. Эта вся прелюдия просто для вашего понимания, что есть в сцене. Я создал копию игрока, соответственно, все что висит на первом игроке, то висит и на копии. Для дальнейшего продвижения в написании игры мне нужно в игре как-то обращаться к конкретному игроку, например, по клику мышки или по нажатию кнопки "next player" на экране. Можете дать советы, как это сделать? Как выделить (не подкрасить при наведении или клике мышки, а именно выделить) объект в сцене?
Правильно ли я рассуждаю?
1) сначала нужно "запихнуть" (как это сделать??) все имеющиеся объекты с тэгом "players" в массив (если "да", то где это лучше делать - в отдельном скрипте или в скрипте Player, или это вообще не принципиально?)
2) рэйкастить из курсора мышки в сцену и по клику получать инфу об объекте (можно ли вообще так рэйкастить из мышки? или можно только из таргета камеры? и как узнать по рейкасту, что это именно объект [1] из массива players, а не [100500]?
3) когда получили от рейкаста инфу, что это именно тот ГО, то уже делаем что-то с этим ГО

правильная логика? или лучше/оптимальнее использовать какие-то другие способы?


Сообщение отредактировал polous - Пятница, 22 Августа 2014, 11:34
polousДата: Понедельник, 18 Августа 2014, 21:03 | Сообщение # 27 | Тема: наследование и полиморфизм
частый гость
Сейчас нет на сайте
Ребята, спасибо всем за помощь! По совету Artaniel я включил начинку метода EnemyPosition(), в котором был switch, в цикл foreach метода EnemyFinder() и все стало замечтательно smile Благодарю!
polousДата: Понедельник, 18 Августа 2014, 15:35 | Сообщение # 28 | Тема: наследование и полиморфизм
частый гость
Сейчас нет на сайте
Ага, спасибо, это тоже учту
polousДата: Понедельник, 18 Августа 2014, 15:25 | Сообщение # 29 | Тема: наследование и полиморфизм
частый гость
Сейчас нет на сайте
biggrin ну что ж, будем пробовать) как проверю - отпишусь) Спасибо, люди добрые, за советы и подсказки!
polousДата: Понедельник, 18 Августа 2014, 15:19 | Сообщение # 30 | Тема: наследование и полиморфизм
частый гость
Сейчас нет на сайте
Цитата polous ()
возьми ID для всех нужных объектов, например, по имени (имена могут совпадать, как в случае с инстансами префаба).
Перебирай ID, ID - в кейсы, бери начальные координаты, выставляй оффсеты.
вуаля?


MANMANA, воу-воу, когда я узнаю, что такое ID, тогда, вполне вероятно, и случится долгожданный "вуаля")
polousДата: Понедельник, 18 Августа 2014, 15:15 | Сообщение # 31 | Тема: наследование и полиморфизм
частый гость
Сейчас нет на сайте
Цитата Artaniel ()
В public void EnemyPosition() , в swich, GameObject.Find ("Enemy") , будет возвращать всегда один и тот же геймобжект(ну если не инстантиировать и не удалять их). А значит и offset будет высчитываться всегда для одного и того же. Даже если ты будешь вызывать этот метод столько же раз, сколько у тебя врагов, он всегда будет брать первого и смотреть его параметры.


Artaniel, понял, а если я буду искать по тэгу всех врагов, а затем для каждого из массива (foreach) я буду делать подобный switch... это изменит ситуацию?
polousДата: Понедельник, 18 Августа 2014, 14:53 | Сообщение # 32 | Тема: наследование и полиморфизм
частый гость
Сейчас нет на сайте
ну я как бы сам могу ответить частично на свой вопрос) у меня метод ищет объект с именем Enemy и все манипуляции он должен проводить именно с Enemy и тут все логично, но это не меняет сути вопроса - когда я в объекте с именем Enemy делаю изменения, объект с именем Enemy2 (на котором, повторюсь, тот же скрипт, что и на Enemy) тоже принимает эти измнения...
polousДата: Понедельник, 18 Августа 2014, 14:47 | Сообщение # 33 | Тема: наследование и полиморфизм
частый гость
Сейчас нет на сайте
Т.е. я хочу сказать, что даже если после сгенерированных рандомом различных позиций для ботов изменить позицию (в данном случае цифру) на иную, то эффекта никакого не происходит, т.к. эта цифра как бы по умолчанию равна той, что у первого бота... как убрать это чертово умолчание?

Добавлено (18.08.2014, 14:47)
---------------------------------------------
Нет, первый назван Enemy, второй Enemy2

polousДата: Понедельник, 18 Августа 2014, 14:40 | Сообщение # 34 | Тема: наследование и полиморфизм
частый гость
Сейчас нет на сайте
В каком смысле не веришь?) Вроде у меня не было еще повода лгать - я тут помощи ищу) ну сейчас запущу Юнити и вставлю, поглядим, будут ли у них разные позиции

Добавлено (18.08.2014, 14:40)
---------------------------------------------
SarCasm, да, все верно, позиции для двух объектов батюшка-рандом сделал разными (т.е. в инспекторе, ну и в дебаге, соответственно, сгенерировало у первого 0, у второго 1).... НО по факту у обоих стало 0... т.е. в инспекторе стоят разные цифири, а вот на деле - у первого 0 и у второго 0 (т.е. Offset в скрипте сработал так будто у обоих 0) и поправку сделал для обоих 8f, а должен был для того, у которого 1 сделать поправку 4f


Сообщение отредактировал polous - Понедельник, 18 Августа 2014, 14:40
polousДата: Понедельник, 18 Августа 2014, 14:19 | Сообщение # 35 | Тема: наследование и полиморфизм
частый гость
Сейчас нет на сайте
Ок, не думал просто, что до этого дойдет, выкладываю скрипты

здесь скрипт, который висит на 2х ботах:
Код

using UnityEngine;
using System.Collections;

public class Enemy : MonoBehaviour {
  public GameObject enemy;
  public int EnemyPosition = 2;
  // EnemyPosition = 2 - враг стоит
  // EnemyPosition = 1 - враг сидит
  // EnemyPosition = 0 - враг лежит

  void Start () {
  }

  void Update () {
  }
}


а вот скрипт, который висит на другом объекте (игрок):
Код

using UnityEngine;
using System.Collections;

public class FindEnemies : MonoBehaviour {
  public Player plr; // переменная-ссылка на класс Player (далее это будет ссылка на объект player)
  public Player _aov; // переменная-ссылка на класс Player (далее это будет ссылка на переменную aov)
  public Player _dov; // переменная-ссылка на класс Player (далее это будет ссылка на переменную dov)
  float distance; // расстояние между положением игрока и положением врага
  float angle; // угол между игроком взглядом игрока в направлении "вперед" и положением врага
  float offset; // поправка к дальности обзора игрока при смене позиции врага
  GameObject[] enemies;
  // метод, который ищет объект с именем "Enemy", затем ищет у него компонент (скрипт) Enemy и  
  // читает из скрипта переменную EnemyPosition (позиция врага)
  // далее он перебирает все возможные варианты переменной EnemyPosition (стоит, сидит, лежит) и
  // изменяет переменную offset - поправка к дальности обзора игрока при попытке обнаружения врага
  public void EnemyPosition()  
  {
   switch (GameObject.Find ("Enemy").GetComponent<Enemy> ().EnemyPosition) {
    case 0:  
    offset = 8f;
    //Debug.Log("Lying enemy;  offset = " + offset);
    break;
    case 1:
    offset = 4f;
    //Debug.Log("Sitting enemy;  offset = " + offset);
    break;
    case 2:
    offset = 0f;
    //Debug.Log("Standing enemy;  offset = " + offset);
    break;
   }
  }

  //public void RayCastToCover() {
  //}

  public void EnemyFinder(){
   //GameObject enemy = GameObject.FindGameObjectWithTag("Enemies");
   //Transform ass = enemy.GetComponent<Transform> ();
   enemies = GameObject.FindGameObjectsWithTag("Enemies");
   foreach (GameObject i in enemies) {
    //Debug.Log(i.transform.position);
    
    distance = Vector3.Distance (plr.player.transform.position, i.transform.position);
    angle = Vector3.Angle (plr.player.transform.forward, i.transform.position - plr.player.transform.position);
    //Debug.Log(i.name);

   Debug.DrawRay(plr.player.transform.position, plr.player.transform.TransformDirection(1,0,1)*_dov.dov/Mathf.Sqrt(2f), Color.red);
   Debug.DrawRay(plr.player.transform.position, plr.player.transform.TransformDirection(0,0,1)*_dov.dov, Color.red);
   Debug.DrawRay(plr.player.transform.position, plr.player.transform.TransformDirection(-1,0,1)*_dov.dov/Mathf.Sqrt(2f), Color.red);
   Debug.DrawRay(plr.player.transform.position, i.transform.position - plr.player.transform.position, Color.blue);
    
   if (angle < _aov.aov && (int) distance < (_dov.dov - offset) && Physics.Raycast (plr.player.transform.position, i.transform.position - plr.player.transform.position, distance - 1f) == false ) {
    i.renderer.enabled = true;
   }
    
   else {
    i.renderer.enabled = false;
   }
   }
  }
}


во втором скрипте много того, что не относится к теме моего вопроса. Хотя часть этого кода может кому и понадобится и будет полезной smile хотя, если я задаю здесь вопросы, то отвечающим вряд ли будет полезно, т.к. вашего опыта хватит, чтоб написать это самим.

Итак, здесь второй скрипт ищет врагов в определенной области. У ботов есть параметр "положение", который я хочу получать для каждого конкретного бота и делать поправку к области зрения игрока. Метод public void EnemyPosition() сейчас написан неверно, т.к. имена у ботов разные будут, да и вообще я по тэгу буду искать, но не суть. Проблема остается той же. Когда я задаю у одного из ботов положение сидеть, оно же передается другому боту. И мне бы не хотелось клепать для каждого бота свой отдельный класс, именно поэтому я упоминал о наследовании и полиморфизме, но этого я не умею пока делать.... есть идеи, как быть?

Добавлено (18.08.2014, 14:17)
---------------------------------------------
Да, MANMANA, есть поиск и по тэгу и по имени объекта, скрипты выше

Добавлено (18.08.2014, 14:19)
---------------------------------------------
Есть еще скрипт игрока, в котором запускаются в Update методы из второго скрипта

polousДата: Понедельник, 18 Августа 2014, 12:33 | Сообщение # 36 | Тема: наследование и полиморфизм
частый гость
Сейчас нет на сайте
Нет, увы, но поля не статик
public int Bla;

Создавал объекты таким образом:
Create -> Cube (это бот №1), затем еще раз Create -> Cube (это бот №2), ну и на каждого один и тот же скрипт с переменной Bla... т.е. я не делал копию первого куба, не делал дубликат, не делал инстэнтиейт в скрипте, не делал префабов и их копий... Иными словами, я не делал родителя и потомка (я так во всяком случае думаю, что не делал потомков, но, видимо, у меня неверная логика).
Так как же сделать объекты с одним скриптом, но с уникальными значениями параметров? О, опытные программисты, подскажите же начинающему)


Сообщение отредактировал polous - Понедельник, 18 Августа 2014, 12:37
polousДата: Понедельник, 18 Августа 2014, 11:38 | Сообщение # 37 | Тема: наследование и полиморфизм
частый гость
Сейчас нет на сайте
Ребята, пожалуйста, дайте подсказку.

Как правильно создать копию/аналог/дубликат объекта с одним и тем же классом, чтобы для каждого из этих копий параметры этого класса были уникальными? Я прочитал о полиморфизме, наследовании, посмотрел на эту тему примеры, но не понимаю, как все-таки реализовать это:
В сцене есть персонаж и есть 2 бота. На ботах висит скрипт, в котором есть параметры, например, одни из паблик параметров - положение бота (или лежит, или сидит, или стоит). Когда я меняю этот параметр в инспекторе, у обоих ботов меняется этот параметр. Мне, как вы поняли, хотелось бы, чтоб не было этого зависимого копирования параметров. Можете подсказать, что для этого нужно сделать?
polousДата: Вторник, 05 Августа 2014, 18:35 | Сообщение # 38 | Тема: Дальность обзора/область видимости
частый гость
Сейчас нет на сайте
Спасибо, статья действительно классная!

Пока вот не особо понимаю, как применить способы, предложенные MANMANA и Novatorvlad, в случае, когда враг по факту находится в области видимости, но при этом пребывает за каким-либо препятствием, полностью скрывающим его. В этом случае, даже при условии, что в программе коллайдер обзорного объекта (например, пирамиды) пересечется с коллайдером врага, он не должен быть обнаружен и бой не должен быть начат.

Правильно ли я мыслю, что здесь нужно применять рэйкаст и проверять между коллайдерами персонажа и врага наличие коллайдера стены, относящейся к другому тэгу нежели коллайдер врага?


Сообщение отредактировал polous - Вторник, 05 Августа 2014, 18:36
polousДата: Вторник, 05 Августа 2014, 13:55 | Сообщение # 39 | Тема: Дальность обзора/область видимости
частый гость
Сейчас нет на сайте
MANMANA, ты крут!) я не догадался до этого) И по поводу зоны слышимости тоже опередил, т.к. это также необходимо будет в дальнейшем. Спасибо!
polousДата: Вторник, 05 Августа 2014, 13:24 | Сообщение # 40 | Тема: Дальность обзора/область видимости
частый гость
Сейчас нет на сайте
Спасибо!!!
сразу пару вопросов:
1) эта функция проверяет вокруг объекта в определенном радиусе наличие другого калайдера... как это сделать в области, отличной от круга? или может как-то запретить срабатывание этой функции при определенных углах?
2) как программно воплотить понятие "видно/не видно" врага? например, используя эту функцию отслеживания в радиусе других калайдеров, как сделать, чтобы вне заданного радиуса объект был invisible, но при при этом существовал и выполнял в свой ход заданные операции - перемещение, поиск врага и прочее?

Добавлено (05.08.2014, 13:24)
---------------------------------------------
Renderer.OnBecameVisible(), Renderer.isVisible и Renderer.enabled, наверное, пригодны для 2ого пункта, нужно пробовать


Сообщение отредактировал polous - Вторник, 05 Августа 2014, 13:26
Форум игроделов » Записи участника » polous [43]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск:

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