Взаимодействие триггера со скриптом персонажа

Программирование на Юнити.

Взаимодействие триггера со скриптом персонажа

Сообщение Kotofeyich 18 июл 2015, 19:33

Имеется сцена StrategyLike, на которой могут находиться несколько Плееров, в их скриптах есть инт переменная, отвечающаа за команду, за которую играет этот персонаж, и флоат переменная с хп. Имеется зона, в простонародии "Фонтан", соответственно есть триггер. В скрипте фонтана тоже прописана Team. Так вот, фонтан должен проверять принадлежность к команде Персонажа, входящего в его триггер, и соответственно действовала на его ХП.
Простите, если криво описал ситуацию.
Kotofeyich
UNец
 
Сообщения: 34
Зарегистрирован: 18 июл 2015, 19:19

Re: Взаимодействие триггера со скриптом персонажа

Сообщение Алифар 19 июл 2015, 10:39

Как один из самых простых вариантов:

Синтаксис:
Используется csharp
void OnTriggerEnter(collider : Collider){

     if(collider.tag == "Team_1") { /// если игрок из команды 1, то...
      /// воздействуем на его ХР
}
     if(collider.tag == "Team_2") { ///если игрок из команды 2, то...
      /// воздействуем на его ХР
}
}


Каждому игроку назначить тег с его командой. Не проверял, но должно работать.
Аватара пользователя
Алифар
UNIт
 
Сообщения: 56
Зарегистрирован: 25 дек 2014, 12:28
Откуда: Ливония

Re: Взаимодействие триггера со скриптом персонажа

Сообщение Kotofeyich 19 июл 2015, 13:15

Алифар писал(а):Как один из самых простых вариантов:

Синтаксис:
Используется csharp
void OnTriggerEnter(collider : Collider){

     if(collider.tag == "Team_1") { /// если игрок из команды 1, то...
      /// воздействуем на его ХР
}
     if(collider.tag == "Team_2") { ///если игрок из команды 2, то...
      /// воздействуем на его ХР
}
}


Каждому игроку назначить тег с его командой. Не проверял, но должно работать.

Это я понимаю, но мне нужен скрипт самого взаимодействия. Я немного не понимаю как реализовать взаимодействие фонтана на персонажей, и к тому же если их будет много с одинаковыми скриптами.
Kotofeyich
UNец
 
Сообщения: 34
Зарегистрирован: 18 июл 2015, 19:19

Re: Взаимодействие триггера со скриптом персонажа

Сообщение samana 19 июл 2015, 13:31

Пусть фонтан запоминает кто находится в его области, добавляя и удаляя игроков из массива при triggerEnter и triggerExit. А когда нужно, то пробежаться по массиву и уже отнять hp у кого надо, вычисляя его id.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Взаимодействие триггера со скриптом персонажа

Сообщение Kotofeyich 19 июл 2015, 14:05

samana писал(а):Пусть фонтан запоминает кто находится в его области, добавляя и удаляя игроков из массива при triggerEnter и triggerExit. А когда нужно, то пробежаться по массиву и уже отнять hp у кого надо, вычисляя его id.

Можешь пожалуйста привести пример самого скрипта, потому что в голове пока не укладывается как это комбинить. [curved_hands]
Kotofeyich
UNец
 
Сообщения: 34
Зарегистрирован: 18 июл 2015, 19:19

Re: Взаимодействие триггера со скриптом персонажа

Сообщение samana 19 июл 2015, 17:38

Хорошо, допустим есть игрок с таким скриптом:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class PlayerScript : MonoBehaviour {

    public int myCommand=1;
    public float HP=100f;
       
}


И фонтан, который сохраняет в себе список тех игроков, которые находятся в нём:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Fontan : MonoBehaviour
{
    // список с игроками
    private List<Transform> objectsInFontan = new List<Transform>();

    //если игрок зашёл в триггер, помещаем игрока в список
    void OnTriggerEnter(Collider col)
    {
        if (col.CompareTag("Player"))
        {
            objectsInFontan.Add(col.transform);
        }
    }

    //если игрок покинут триггер, то удаляем его из списка
    void OnTriggerExit(Collider col)
    {
        if (col.CompareTag("Player"))
        {
            objectsInFontan.Remove(col.transform);
        }
    }

    //нанести урон на 10 hp всем игрокам находящимися в области триггера,
    //если они состоят в команде 1
    public void Damage()
    {
        foreach (Transform player in objectsInFontan)
        {
            PlayerScript script = player.GetComponent<PlayerScript>();
            if (script.myCommand == 1)
                script.HP -= 10;
        }
    }
 


Думаю это не единственный способ и возможно что-то не учтено.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Взаимодействие триггера со скриптом персонажа

Сообщение Kotofeyich 19 июл 2015, 22:55

samana писал(а):
Скрытый текст:
Хорошо, допустим есть игрок с таким скриптом:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class PlayerScript : MonoBehaviour {

    public int myCommand=1;
    public float HP=100f;
       
}


И фонтан, который сохраняет в себе список тех игроков, которые находятся в нём:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Fontan : MonoBehaviour
{
    // список с игроками
    private List<Transform> objectsInFontan = new List<Transform>&#40;&#41;;

    //если игрок зашёл в триггер, помещаем игрока в список
    void OnTriggerEnter&#40;Collider col&#41;
    {
        if &#40;col.CompareTag&#40;"Player"&#41;&#41;
        {
            objectsInFontan.Add&#40;col.transform&#41;;
        }
    }

    //если игрок покинут триггер, то удаляем его из списка
    void OnTriggerExit&#40;Collider col&#41;
    {
        if &#40;col.CompareTag&#40;"Player"&#41;&#41;
        {
            objectsInFontan.Remove&#40;col.transform&#41;;
        }
    }

    //нанести урон на 10 hp всем игрокам находящимися в области триггера,
    //если они состоят в команде 1
    public void Damage&#40;&#41;
    {
        foreach &#40;Transform player in objectsInFontan&#41;
        {
            PlayerScript script = player.GetComponent<PlayerScript>&#40;&#41;;
            if &#40;script.myCommand == 1&#41;
                script.HP -= 10;
        }
    }
 


Думаю это не единственный способ и возможно что-то не учтено.

Ну смотри, я ради теста максимально сократил скрипт:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Phontan : MonoBehaviour {
       
        void OnTriggerEnter(Collider unit){

                if (unit.tag == "Player") {
                        PlayerScript player = unit.GetComponent<PlayerScript>();//PlayerScript - скрипт игрока
                        player.active = true;//active - булевая перемення, объявленная в скрипте Navigation
                }
        }
}
 

Скрипт написан на примере твоего. Не работает. Где ошибка?
Kotofeyich
UNец
 
Сообщения: 34
Зарегистрирован: 18 июл 2015, 19:19

Re: Взаимодействие триггера со скриптом персонажа

Сообщение getAlex 20 июл 2015, 13:17

Это немного странный подход(т.к. обычно через компонент не делают), но я всё же посоветую.
Начнём с того, что реген от фонтана это эффект, такие как замедления от ледяной стрелы, стан, яд или аура урона.
Когда плеер входит в зону фонтана, сперва проверяется за какую команду(союзник/враг) фонтан и за какую команду игрок. Если в настройках спела указано, что текущий спел распространяется на союзников, а не на врагов(ещё можно проверять действует ли на воздушные единицы, на технику и т.д.), тогда игроку добавляется компонент Regen: ISpell , который в свою очередь хеширует GetComponent<Player>() и дальше воздействует на характеристики плеера. Если это аура, то компонент сам себя уничтожает через какой-то определённый тик времени(даже если аура моментальна - должен быть тик). Если же это какой-то "морозная стрела 5 уровня", то у неё в характеристиках и так есть сколько она висит на персонаже. Как только компонент отваливается, он перестаёт действовать на персонажа. Для моментальных аур ещё можно проверять "находится в зоне", чтоб не было как в вар3 иногда глючили ауры и мелькали.
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

Re: Взаимодействие триггера со скриптом персонажа

Сообщение Kotofeyich 20 июл 2015, 13:52

getAlex писал(а):
Скрытый текст:
Это немного странный подход(т.к. обычно через компонент не делают), но я всё же посоветую.
Начнём с того, что реген от фонтана это эффект, такие как замедления от ледяной стрелы, стан, яд или аура урона.
Когда плеер входит в зону фонтана, сперва проверяется за какую команду(союзник/враг) фонтан и за какую команду игрок. Если в настройках спела указано, что текущий спел распространяется на союзников, а не на врагов(ещё можно проверять действует ли на воздушные единицы, на технику и т.д.), тогда игроку добавляется компонент Regen: ISpell , который в свою очередь хеширует GetComponent<Player>() и дальше воздействует на характеристики плеера. Если это аура, то компонент сам себя уничтожает через какой-то определённый тик времени(даже если аура моментальна - должен быть тик). Если же это какой-то "морозная стрела 5 уровня", то у неё в характеристиках и так есть сколько она висит на персонаже. Как только компонент отваливается, он перестаёт действовать на персонажа. Для моментальных аур ещё можно проверять "находится в зоне", чтоб не было как в вар3 иногда глючили ауры и мелькали.

Можешь закрепить это все примером, ибо я пока что рак. Я примерно понял о чем ты, но до сих пор не понимаю, как будет производиться воздействие на скрипт.
Kotofeyich
UNец
 
Сообщения: 34
Зарегистрирован: 18 июл 2015, 19:19

Re: Взаимодействие триггера со скриптом персонажа

Сообщение getAlex 20 июл 2015, 17:54

Kotofeyich писал(а):Можешь закрепить это все примером, ибо я пока что рак.

Ну так учись быть не раком, а потом пиши. Мне влом ради примера писать 200 строчек кода.
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

Re: Взаимодействие триггера со скриптом персонажа

Сообщение senzx 17 апр 2022, 21:55

Эхх, кайфовали вы тогда в 2015 году...
senzx
UNец
 
Сообщения: 5
Зарегистрирован: 23 фев 2022, 12:14


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7