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, Ну незнаю... Идей я тебе подал. ты сам думай какими воспользоваться
|
|
| |