Пятница, 26 Апреля 2024, 05:45

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Targetting
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

Во-вторых
Если просто переменная то будет так

Code

if(a.bool){

}


Ну и 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, Ну незнаю... Идей я тебе подал. ты сам думай какими воспользоваться
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Targetting
  • Страница 1 из 1
  • 1
Поиск:

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