Как сделать хедшот?
|
|
Vasiliy_Ivanovich | Дата: Воскресенье, 01 Ноября 2015, 01:13 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Здравствуйте. Расскажите кто-нибудь пожалуйста как реализуется система при которой враг теряет разное количество НР в зависимости от того в какую из частей его тела попала пуля (в моем случае луч), например в голову -100 НР, в тело -50, в руку -20 и т.д. Скрипт стрельбы (и получения урона врагом) у меня такой:
Код using UnityEngine; using System.Collections;
public class Shoot : MonoBehaviour { void Update () { Ray ray1 = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2,Screen.height / 2)); RaycastHit hit1; if (Input.GetMouseButtonDown (0)) { if (Physics.Raycast (ray1, out hit1,1000f)) { GameObject enemy = hit1.collider.gameObject; if (enemy.tag == "enemy"){ enemy.GetComponent<HealthScript>().hp -= 30;
} }
} } }
|
|
| |
shizofren | Дата: Воскресенье, 01 Ноября 2015, 14:56 | Сообщение # 2 |
Starting MS-DOS...
Сейчас нет на сайте
| Vasiliy_Ivanovich, делаешь в модели NPC, в которого попадаешь, разные коллайдеры на голову, руки, ноги.
Моя команда
|
|
| |
Vasiliy_Ivanovich | Дата: Воскресенье, 01 Ноября 2015, 16:06 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| а как в скрипте обозначить что луч попал в коллайдер например ноги именно этого объекта?
|
|
| |
URGINSAN | Дата: Воскресенье, 01 Ноября 2015, 17:04 | Сообщение # 4 |
почти ветеран
Сейчас нет на сайте
| Vasiliy_Ivanovich, либо по тегу искать, либо по имени
Я на драйве
|
|
| |
Vasiliy_Ivanovich | Дата: Воскресенье, 01 Ноября 2015, 19:26 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Цитата URGINSAN ( ) либо по тегу искать, либо по имени что именно искать по тегу? вот у меня в скрипте по тегу найден родительский объект, а как найти его дочерние объекты, руки ноги и т.д.? ведь руки ноги и тд. это его дочерние объкеты?
|
|
| |
shizofren | Дата: Воскресенье, 01 Ноября 2015, 22:46 | Сообщение # 6 |
Starting MS-DOS...
Сейчас нет на сайте
| Цитата Vasiliy_Ivanovich ( ) что именно искать по тегу? hit.transform.tag
Моя команда
|
|
| |
Vasiliy_Ivanovich | Дата: Понедельник, 02 Ноября 2015, 00:15 | Сообщение # 7 |
был не раз
Сейчас нет на сайте
| Цитата shizofren ( ) hit.transform.tag
каждой части тела нужно тег назначить, я правильно понимаю? в таком случае как в скрипте указать что эта часть тела какого-то определенного объекта?
|
|
| |
shizofren | Дата: Понедельник, 02 Ноября 2015, 08:46 | Сообщение # 8 |
Starting MS-DOS...
Сейчас нет на сайте
| Vasiliy_Ivanovich, да, в редакторе назначить каждому колайдеру для каждой части тела свой тег (head, body, arm), а потом сделать что-то вроде такого:
Код HealthScript hitingHealth; if (Physics.Raycast (ray1, out hit, 1000f)) { hitingHealth = hit1.transform.GetComponent<HealthScript>(); switch(hit.transform.tag) { case "head": hitingHealth.hp -= 100; return; case "body": hitingHealth.hp -= 50; return; case "arm" : hitingHealth.hp -= 25; return; }
Моя команда
|
|
| |
Vasiliy_Ivanovich | Дата: Понедельник, 02 Ноября 2015, 13:50 | Сообщение # 9 |
был не раз
Сейчас нет на сайте
| Изменил скрипт на то, что вы говорили
Код using UnityEngine; using System.Collections;
public class Shoot : MonoBehaviour { void Update () { HealthScript hitingHealth;
Ray ray1 = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2,Screen.height / 2)); RaycastHit hit1; if (Input.GetMouseButtonDown (0)) { if (Physics.Raycast (ray1, out hit1,1000f)) { hitingHealth = hit1.transform.GetComponent<HealthScript>(); switch(hit1.transform.tag) { case "head": hitingHealth.hp -= 100; return; case "body": hitingHealth.hp -= 50; return; case "arm" : hitingHealth.hp -= 25; return; } } } } }
Выдает такую ошибку
Код NullReferenceException: Object reference not set to an instance of an object
при этом "body" это тег родительского объекта и при попадании в него никаких ошибок не возникает
Сообщение отредактировал Vasiliy_Ivanovich - Понедельник, 02 Ноября 2015, 13:59 |
|
| |
shizofren | Дата: Понедельник, 02 Ноября 2015, 13:56 | Сообщение # 10 |
Starting MS-DOS...
Сейчас нет на сайте
| Vasiliy_Ivanovich, на какой строчке?
Моя команда
|
|
| |
Vasiliy_Ivanovich | Дата: Понедельник, 02 Ноября 2015, 15:35 | Сообщение # 11 |
был не раз
Сейчас нет на сайте
| Цитата shizofren ( ) Vasiliy_Ivanovich, на какой строчке?
на строчках
case "head": hitingHealth.hp -= 100; return; case "arm" : hitingHealth.hp -= 25; return;Добавлено (02 ноября 2015, 15:35) --------------------------------------------- В общем покапался в справке чуть-чуть, и на меня нахлынуло вдохновение. Его результат ниже
Код using UnityEngine; using System.Collections;
public class Shoot : MonoBehaviour { void Update () { Ray ray1 = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2,Screen.height / 2)); RaycastHit hit1; if (Input.GetMouseButtonDown (0)) { if (Physics.Raycast (ray1, out hit1,1000f)) { GameObject enemy = hit1.collider.gameObject; if (enemy.tag == "enemy"){ enemy.GetComponent<HealthScript>().hp -= 30;
} if (enemy.tag == "arm") { enemy.GetComponentInParent<HealthScript> ().hp -= 15; } if (enemy.tag == "head") { enemy.GetComponentInParent<HealthScript> ().hp -= 100; } }
} } }
при этом теги на разные конечности конечно же были назначены
|
|
| |
shizofren | Дата: Понедельник, 02 Ноября 2015, 17:19 | Сообщение # 12 |
Starting MS-DOS...
Сейчас нет на сайте
| Vasiliy_Ivanovich, ошибка не может быть "На строчках", только на одной строчке. Скорее всего неправильно инициализирован hittingHealth, нужно следить за тем, чтобы не было испльзования неициализированной переменной. И для таких задач лучше использовать не if, а switch.
Моя команда
Сообщение отредактировал shizofren - Понедельник, 02 Ноября 2015, 17:20 |
|
| |