Пятница, 29 Марта 2024, 01:12

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

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

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