| Targetting | 
|  | 
| 
| Gomg | Дата: Суббота, 21 Июля 2012, 17:23 | Сообщение # 1 |  | был не раз Сейчас нет на сайте | Я хочу чтобы при атаке ЛЮБОГО живого объекта делалась на него наводка, объясните как этого можно добиться? Добавлено (21.07.2012, 17:23)---------------------------------------------
 я так понял что надо массив объектов делать , типа нпс, монстры и т.д. и там выбирать ближайшего и если расстояние до него меньше заданного при атаке показывать ГУИ, но как правильно записать это
 |  |  |  |  | 
| 
| donos | Дата: Суббота, 21 Июля 2012, 17:47 | Сообщение # 2 |  | был не раз Сейчас нет на сайте | Поискал бы сначало. 
 http://www.youtube.com/watch?v=H8q9qHCn5Gk&feature=player_embedded
 http://www.youtube.com/watch?feature=player_embedded&v=c9BdBOQvDtg
 http://www.youtube.com/watch?feature=player_embedded&v=G5I2uJznuhA
 |  |  |  |  | 
| 
| Gomg | Дата: Суббота, 21 Июля 2012, 17:56 | Сообщение # 3 |  | был не раз Сейчас нет на сайте | donos, я же написал что нужно появление хелсбара, при ударе ЛЮБОГО живого объекта, будь то монстр, или человек, или животное, а не на кнопку последовательно все подряд. Пример: как в Готике или Скайриме. Добавлено (21.07.2012, 17:56)---------------------------------------------
 donos, и причем у него листинг, а не массив объектов с тегом.
 |  |  |  |  | 
| 
| Povstalez | Дата: Суббота, 21 Июля 2012, 19:08 | Сообщение # 4 |  |   постоянный участник Сейчас нет на сайте | Quote (Gomg) ри ударе ЛЮБОГО живого объекта, будь то монстр, или человек, или животное, а не на кнопку последовательно все подряд. Пример: как в Готике или Скайриме.Делаешь 1 скрипт на всех мобов. в нём нужно будет указать ХП и прочие параметры. потом делаем 2 була:
 1. targetting;
 2. distance;
 
 делаем проверку в
 
 Code OnGUI() {
 if(targetting == true && distance == true){
 GUI.**********;
 }
 }
targetting - переменная делается тру если игрок ударил объект (делается в скрипте атаки через GetComponent<>();), distance - делается тру если дистанция между объектом и игроком <= разрешенной.
 |  |  |  |  | 
| 
| donos | Дата: Суббота, 21 Июля 2012, 19:20 | Сообщение # 5 |  | был не раз Сейчас нет на сайте | Gomg, Во-первых я написал сообщение когда еще не было написано добавление, просто отвлекся и отправил поздно. Во-вторых, это пример. Ты не когда не найдешь 100% скрипт/урок который подошел бы под твою игру.
 
 Если тебе надо выбор непосредственно ближайшего врага, в центре экрана то можно написать так.
 
 
 Code  void Update () {
 //Возращает луч из центра экрана
 Ray ray = Camera.mainCamera.ScreenPointToRay(new Vector3(Screen.width/2,Screen.height/2,0));
 RaycastHit hit;
 //Проверка есть ли кто с тегом Enemy на пересечении луча c С дистанцией 10
 if(Physics.Raycast(ray,out hit,10f) && hit.collider.tag == "Enemy")
 {
 //Противник попал в дистанцию 10
 
 }
 }
 
 |  |  |  |  | 
| 
| Gomg | Дата: Воскресенье, 22 Июля 2012, 04:03 | Сообщение # 6 |  | был не раз Сейчас нет на сайте | спасибо попробую, но можно все таки сделать массив объектов по нескольким тегам? как записывается? |  |  |  |  | 
| 
| donos | Дата: Воскресенье, 22 Июля 2012, 04:30 | Сообщение # 7 |  | был не раз Сейчас нет на сайте | А чем тебя не устраивает 1 тег НПС. И переменная типа этого НПС. |  |  |  |  | 
| 
| Gomg | Дата: Воскресенье, 22 Июля 2012, 05:25 | Сообщение # 8 |  | был не раз Сейчас нет на сайте | donos, ну кроме нпс есть еще и монстры же, потом когда диалоги будут, будет каша если теги назначить неверно.
 
 и еще как правильно при условии проверить значение переменной из другого скрипта.
 например: у меня в скрипте A0001 есть переменная bool со значением False, как мне из скрипта B0001 проверить (БУЛ == true),
 надо писать:
 A0001 a = (A0001).target.GetComponent("A0001")
 
 if (a.bool())
 ...
 ?
 
 и вообще зачем писать target. в нете, насчет юнити материала на проверку переменной из другого скрипта в условиях, нет.
 
 
 Сообщение отредактировал Gomg - Воскресенье, 22 Июля 2012, 05:26 |  |  |  |  | 
| 
| donos | Дата: Воскресенье, 22 Июля 2012, 07:00 | Сообщение # 9 |  | был не раз Сейчас нет на сайте | Ну дело твое, просто в моем понимание легче зделать 1 тег, и много типов. 
 Во-первых тут точка не нужна.
 (A0001).target
 (A0001)target
 
 Во-вторых
 Если просто переменная то будет так
 
 
 
 Ну и target - это переменная GameObject. То есть нашей цели.
 И он уже из этого объекта ищет компонент.
 
 з.ы. В место target можно написать что угодно, но так понятнее тебе и тем кто будет работать с твоим скриптом. Если вдруг что.
 |  |  |  |  | 
| 
| Gomg | Дата: Воскресенье, 22 Июля 2012, 07:08 | Сообщение # 10 |  | был не раз Сейчас нет на сайте | спасибо, но обязательно писать так перед каждым условием? {
 A0001 a = (A0001)target.GetComponent("A0001")
 if (a.bool)
 тыры-пыры
 }
 {
 A0001 a = (A0001)target.GetComponent("A0001")
 else if (a.bool = false)
 тыры пыры
 }
 то есть я имел ввиду перед каждым условием надо писать то что красным?
 
 и как делается новый тип?
 
 
 Сообщение отредактировал Gomg - Воскресенье, 22 Июля 2012, 07:09 |  |  |  |  | 
| 
| donos | Дата: Воскресенье, 22 Июля 2012, 08:28 | Сообщение # 11 |  | был не раз Сейчас нет на сайте | Нет не обязательно. Грубо говоря ты этой строчкой
 A0001 a = (A0001)target.GetComponent("A0001")
 
 присваиваешь Компонент A0001 переменной а
 и ты можешь ее использовать дальше, пока не обозначешь ее новым компонентом.
 
 Ну а типы.
 
 Нужно в скрипте на НПС/враге добавить переменную.. которая будет обозначать тип.
 И вызывать для проверки ее через скрип таргета... или тех же разговоров с НПС
 |  |  |  |  | 
| 
| Gomg | Дата: Воскресенье, 22 Июля 2012, 08:41 | Сообщение # 12 |  | был не раз Сейчас нет на сайте | можешь привести пример кусочка кода? про типы donos, 
 Добавлено (22.07.2012, 08:41)
 ---------------------------------------------
 donos,
 нет насчет конпонента не работает вот http://firepic.org/?v=2.2012-07-22_ezxm6ef2ifzl.png
 
 
 Сообщение отредактировал Gomg - Воскресенье, 22 Июля 2012, 08:42 |  |  |  |  | 
| 
| donos | Дата: Воскресенье, 22 Июля 2012, 08:56 | Сообщение # 13 |  | был не раз Сейчас нет на сайте | Enemy 
 Code  using UnityEngine;
 using System.Collections;
 
 public class Enemy : MonoBehaviour {
 
 public string TypeEnemy;
 
 }
 
 
 Таргет
 
 
 Code  using UnityEngine;
 using System.Collections;
 
 public class Target : MonoBehaviour {
 public GameObject target;
 // Update is called once per frame
 void Update () {
 Enemy go = (Enemy)target.GetComponent("Enemy");
 
 if(go.TypeEnemy == "npc"){
 
 }
 }
 }
 
 
 Если что не понятно пиши.
 Добавлено (22.07.2012, 08:56)---------------------------------------------
 
 Quote (Gomg) нет насчет конпонента не работает вот http://firepic.org/?v=2.2012-07-22_ezxm6ef2ifzl.png Смотри
 
 Ты вызываешь eh когда выполняется условие.
 0,7 < Дистанция < 2
 Тоесть если оно не выполняеться то он не вызывает eh.
 
 Поэтому в противном случае он и пишет, что такого компонента нету.
 
 Выход.. аоднять строчку с Enemy eh = ..... перед условием
 0,7 < Дистанция < 2
 |  |  |  |  | 
| 
| Gomg | Дата: Воскресенье, 22 Июля 2012, 09:06 | Сообщение # 14 |  | был не раз Сейчас нет на сайте | donos, спасибо получилось! 
 но у меня есть еще проблема, я хочу так чтобы подходишь к врагу ударяешь появляется его хелсбар ( это я сделал), но когда отходишь например distance > 40 то хелсбар исчезает. то есть если поставить строку ( distance = Vector3.Distance (target.transform.position, transform.position); ) в void Attack, то она обновляется при вызове атаки (то есть при нажатии F), а если эту строку поставить в void update, то distance почему-то увеличивается, то есть атака становится невозможной и здоровье врагу не отнимается (потому что distance растет и становится больше 2). Куда надо поставить эту строку чтобы бар исчезал корректно.
 
 public class PlayerAttack : MonoBehaviour {
 public GameObject target;
 public float coolDown;
 public float attackTimer = 0;
 public float distance;
 
 void Start () {
 if (coolDown <= 0 )
 coolDown = 1.8f;
 }
 
 
 void Update () {
 if (attackTimer > 0)
 attackTimer -= Time.deltaTime;
 if (attackTimer < 0)
 attackTimer = 0;
 if (Input.GetKeyUp(KeyCode.F))
 if (attackTimer == 0){
 Attack();
 attackTimer = coolDown;	}
 }
 
 
 
 private void Attack () {
 distance = 0;
 distance = Vector3.Distance (target.transform.position, transform.position);
 Vector3 dir = (target.transform.position - transform.position).normalized;
 float direction = Vector3.Dot(dir, transform.forward);
 EnemyHealth eh = (EnemyHealth)target.GetComponent("EnemyHealth");
 if (distance < 2 && direction > 0.7) {
 eh.AdjustCurrentHealth(-10);
 eh.showHealthBar = true; }
 if (distance > 40 || eh.currentHealth == 0){
 eh.showHealthBar = false;}
 }
 }
 Добавлено (22.07.2012, 09:06)---------------------------------------------
 donos, может быть код непонятен но я не умею вставлять его как у тебя построчно
 |  |  |  |  | 
| 
| donos | Дата: Воскресенье, 22 Июля 2012, 09:16 | Сообщение # 15 |  | был не раз Сейчас нет на сайте | Для вставки кода, на панеле есть кнопка code 
 Тут проблема в том, что дистанция определяется непосредственно во время удара. и как перекрутить твой код после суток без сна сейчас не придумаю....
 
 Я бы, на твое месте, написал определение дистанции сначало. И если кто-то есть в этой дистанции то при нажатии F
 Включался ХПбар и производился удар...
 
 Еслиже нету на данной дистанции некого, то ХПбар выключался. А при нажатии на F просто был удар в пустоту.
 |  |  |  |  | 
| 
| Gomg | Дата: Воскресенье, 22 Июля 2012, 09:18 | Сообщение # 16 |  | был не раз Сейчас нет на сайте | donos, извини что загружаю, ладно тогда как нибудь покручу код. спасибо |  |  |  |  | 
| 
| donos | Дата: Воскресенье, 22 Июля 2012, 09:19 | Сообщение # 17 |  | был не раз Сейчас нет на сайте | Илиже можно написать таймер, обнулялся с каждым ударом. А при задержке в 10 сек, сам тушил бар |  |  |  |  | 
| 
| Gomg | Дата: Воскресенье, 22 Июля 2012, 09:23 | Сообщение # 18 |  | был не раз Сейчас нет на сайте | donos, не так не получится через десять секунд после бездействия он выключит бар а враг будет все равно бить, а надо чтобы как бы режим боя был. |  |  |  |  | 
| 
| donos | Дата: Воскресенье, 22 Июля 2012, 09:29 | Сообщение # 19 |  | был не раз Сейчас нет на сайте | Gomg, Ну незнаю... Идей я тебе подал. ты сам думай какими воспользоваться |  |  |  |  |