Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 3
Регистрация: 19.03.2015
Сообщений: 207
1

Как отнять хп у клона, а не у его префаба? c#

07.10.2015, 18:52. Просмотров 4069. Ответов 15
Метки нет (Все метки)


Как сделать так чтобы у клона снималось хп? А то я делаю делаю, и не могу понять и что делать если хп отнимается у префаба?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2015, 18:52
Ответы с готовыми решениями:

Обратиться к имени префаба, не зная его
Здравствуйте, На разных префабах один скрипт. На сцене появляется один из этих префабов....

Создание префаба и изменение в его дочернем объекте компонента
При нажатии пользователем кнопки должно создаться определенное количество объектов. Каждый объект...

Отнять от каждого числа 1, заменить его на символ и вывести строку
Есть string-массив номеров символов, например: { "24", "41", "27" } Надо отнять от каждого числа...

как убить клона?
Добрый день! Впервые сталкиваюсь, с подобной проблемой, поэтому прошу ответить как можно...

15
Быдлокодер
510 / 297 / 84
Регистрация: 22.11.2009
Сообщений: 892
07.10.2015, 19:04 2
Так ты ссылайся на экземпляр клона, чтобы изменить значение, а не на сам префаб.

Пока не очень понятно, лучше приложи код
0
0 / 0 / 3
Регистрация: 19.03.2015
Сообщений: 207
07.10.2015, 21:08  [ТС] 3
код префаба
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using UnityEngine;
using System.Collections;
 
public class test2 : MonoBehaviour {
    public float smotr = 5f;
    public float ataka = 2f;
    private Transform target;
    public GameObject tar;
    public GameObject gol;
    public AnimationClip idel;
    public AnimationClip walk;
    public AnimationClip atack;
    Animation animation;
    public float hp = 100;
    public float damage1;
    public float dilay = 1.0f;
    float time;
    NavMeshAgent nav;
    controller ct;
    blad t;
    public GameObject sp;
    Spawn s;
    void Start () {
        s = sp.GetComponent<Spawn> ();
        animation = gameObject.GetComponent<Animation> ();
        target = GameObject.FindGameObjectWithTag ("Player").transform;
        nav = GetComponent<NavMeshAgent> ();
        ct = tar.GetComponent<controller> ();
        t = target.GetComponent<blad> ();
    }
 
    void Update () {
//
        if (hp >= 100 ) {
            hp = 100;
        }
//
        if (hp <= 0) {
            hp = 100;
        }
//
        if (target == null) {
            Destroy (this.gameObject);
        } else
//  
        if (Vector3.Distance (transform.position, target.transform.position) < smotr) {
            if (Vector3.Distance (transform.position, target.transform.position) > ataka) {
                animation.Play (walk.name);
                nav.enabled = true;
                nav.SetDestination (target.position);
            } else {
                animation.Play (atack.name);
                nav.enabled = false;
            }
        }
            else {
            animation.Play(idel.name);
            nav.enabled=false;
 
        }
    }
}
и второй код тип респа клонов.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using UnityEngine;
using System.Collections;
 
public class Spawn : MonoBehaviour {
    public GameObject[] mob;
    public Transform[] spwnPoint;
    public int bla;
    GameObject lol;
    Transform pos;
    public float Timer;
    test2 t;
    private Transform target;
      Transform gopa;
    public float hp = 100;
    public static GameObject lool;
    void Awake () {
    //  Timer += Time.time + 5;
 
    }
    void Start(){
        target = GameObject.FindGameObjectWithTag ("Player").transform;
    
    }
 
    void Update () {
        for (int i = 0; i< bla; i++) {
            if (Timer < Time.time) {
                pos = spwnPoint[Random.Range(0,spwnPoint.Length)];
                lol = mob[Random.Range(0,mob.Length)];
             Instantiate(lol,pos.position,pos.rotation);
                Timer += Time.time + 20;
        
            }
        }
    
    }
 
 
}
Добавлено через 42 секунды
Как отнять у клона я хз, может подскажешь как в коде это записать?

Добавлено через 1 час 22 минуты
Может найдутся люди и скажут как? а то интернет перерыл ничего не нашел.
Или плохо искал, но искал часа два.
0
Быдлокодер
510 / 297 / 84
Регистрация: 22.11.2009
Сообщений: 892
07.10.2015, 21:34 4
Я не нашел части кода, где ты отнимаешь хп. Все остальное, по сути, не нужно для решения проблемы.

Кстати, кто тебя учил давать имена объектам?
0
209 / 199 / 63
Регистрация: 24.09.2014
Сообщений: 532
07.10.2015, 21:35 5
Покажи скрипт в котором ты хп отнимаешь?
0
0 / 0 / 3
Регистрация: 19.03.2015
Сообщений: 207
07.10.2015, 23:03  [ТС] 6
Вот
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using UnityEngine;
using System.Collections;
using UnityStandardAssets.CrossPlatformInput;
public class blad : MonoBehaviour {
    public AnimationClip attack;
    Animation animus;
    public AnimationClip run;
    public AnimationClip idel;
    public Transform target;
    test2 t;
    public float hp = 100;
    public float damage; 
    public float dilay = 0.1f;
    float time;
    Spawn spaw;
    public GameObject spawn;
    public GameObject g;
    public float Timer;
    void Start () {
        animus = gameObject.GetComponent<Animation> ();
        t = g.GetComponent<test2> ();
    //  spaw = spawn.GetComponent<Spawn>();
 
    }
    public void DestroyObjeckt()
    {
        var bombPos = transform.position;
        var clone = Instantiate (g,bombPos,Quaternion.identity);
 
 
    }
    void Update () {
        if (hp <= 0) {
            Destroy(gameObject);
        }
        if (target == null) {
            if (CrossPlatformInputManager.GetAxis ("Vertical") > 0.2 && CrossPlatformInputManager.GetAxis ("Horizintal") < 0.2) {
                animus.Play (run.name);
            } else {
                animus.Play (idel.name);
            }
        } else {
            if (Vector3.Distance (transform.position, target.transform.position) > 8) {
                if (CrossPlatformInputManager.GetAxis ("Vertical") > 0.2 && CrossPlatformInputManager.GetAxis ("Horizintal") < 0.2) {
                    animus.Play (run.name);
                } else {
                    animus.Play (idel.name);
                }
            } else {
                if (CrossPlatformInputManager.GetButton ("Faire1")) {
                    animus.Play (attack.name);
                    if(Timer < Time.time){
                        t.hp = t.hp - damage;
                        damage=Random.Range(10,15);
                        Timer += Time.time + 0.1f;
                    }
                    if(t.hp<=0)
                    {
                        if(gameObject.name == "bot(Clone)"){
                            Destroy(gameObject);
                        }
                    }
                        Debug.Log("kek");
                    //
                    
                }
            }
        }
    }
}
Добавлено через 54 секунды
Называю переменные как удобно и не путаюсь. Никто не учил.
0
[Bicycle Reinventor]
322 / 260 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
08.10.2015, 09:11 7
Недавно на stackexchange был похожий вопрос - автор делал несколько объектов из префаба, каждый из которых имел дочернюю систему частиц, которая должна была включаться от пользовательского ввода, но при нажатии на кнопку включались системы частиц во всех клонах одновременно. Ответ так и не был найден, поэтому подпишусь сюда, проблема, как мне видится, та же самая.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void Start()
{
    mainThrust = this.GetComponentsInChildren<ParticleSystem> ();
    foreach (ParticleSystem jetPack in mainThrust)
    {
        jetPack.enableEmission = true;
        if (jetPack.isPlaying)
        {
            jetPack.Stop ();
        }
    }
}
 
 
private void MoveWithJetPack()
{
    foreach (ParticleSystem jetPack in mainThrust)
    {
        if (jetPack.isStopped)
        {
            jetPack.Play ();
        }
 
    }
}
 
private void killJetPack()
{
    foreach (ParticleSystem jetPack in mainThrust)
    {
        if (jetPack.isPlaying)
        {
            jetPack.Stop ();
        }
 
    }
}
0
Быдлокодер
510 / 297 / 84
Регистрация: 22.11.2009
Сообщений: 892
08.10.2015, 12:04 8
Цитата Сообщение от Exerion Посмотреть сообщение
Недавно на stackexchange был похожий вопрос - автор делал несколько объектов из префаба, каждый из которых имел дочернюю систему частиц, которая должна была включаться от пользовательского ввода, но при нажатии на кнопку включались системы частиц во всех клонах одновременно. Ответ так и не был найден, поэтому подпишусь сюда, проблема, как мне видится, та же самая.
Нет, не та же самая даже близко. Здесь он намеренно изменяет префаб.
Ты говоришь
Цитата Сообщение от Exerion Посмотреть сообщение
которая должна была включаться от пользовательского ввода
Значит, каждый конкретный клон подписывался на событие нажатия кнопки, при котором вызывается MoveWithJetPack()? А был ли какой-то контроллер, управляющий, в каком клоне должен начаться процесс? Если нет, то ничего удивительного в описанном поведении нет. Ты нажал кнопку - все подписанные клоны вызвали метод.
Либо ты что-то неправильно объяснил.

А по теме - просто какой-то бред, в этом коде черт ногу сломит. Проблема в том, что ты делаешь
Цитата Сообщение от dobrotiu Посмотреть сообщение
t = g.GetComponent<test2> ();
А "g" у тебя - видимо, тот самый префаб. Тебе нужно завести переменную для

Цитата Сообщение от dobrotiu Посмотреть сообщение
Instantiate(lol,pos.position,pos.rotation);
из скрипта "Spawn" и ссылаться на нее, ибо это и есть экземпляр твоего клона.
0
[Bicycle Reinventor]
322 / 260 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
08.10.2015, 15:21 9
Цитата Сообщение от Darky Посмотреть сообщение
Значит, каждый конкретный клон подписывался на событие нажатия кнопки, при котором вызывается MoveWithJetPack()? А был ли какой-то контроллер, управляющий, в каком клоне должен начаться процесс? Если нет, то ничего удивительного в описанном поведении нет. Ты нажал кнопку - все подписанные клоны вызвали метод.
Не, там нет никакой подписки, он вызывает метод напрямую через GetComponent:
So, for instance, a character that is about to move is the "currently selected" character in the "game controller" script. and a call is made as such when he needs to turn on his jetpack. currentSelection.GetComponent<jetPack_script>().MoveWithJetP ack();
Короче, тоже не понятно. Всё не так плохо, как у местного автора, но тоже фигня.

Добавлено через 26 минут
Кажется я начинаю догадываться. У меня такой практики никогда не было, но вероятно это работает.

Допустим, у нас в сцене есть некий объект, называемый спавнером. На нём висит скрипт с публичной переменной public GameObject thingToSpawn;
Допустим, у нас есть префаб некоторого объекта, который нужно спавнить.
Представим себе три возможных ситуации:
  1. Нормальная. В инспекторе мы перетаскиваем префаб нужного объекта в публичное поле спавнера в сцене. В скрипте спавнера мы спавним клон префаба следующим образом:
    C#
    1
    
    GameObject clone = Instantiate(thingToSpawn);
    и редактируем что-либо, например,позицию клона:
    C#
    1
    
    clone.transform.position = Vector3.zero;
    Предполагаемое поведение при вызове этого метода 2-3 раза: создаются новые клоны, каждый из них перемещается независимо от других.

  2. Не очень нормальная. В инспекторе мы перетаскиваем инстанс нужного объекта из сцены в публичное поле спавнера в сцене. В скрипте спавнера мы спавним клон объекта также, как и в первом случае.
    Предполагаемое поведение при вызове этого метода 2-3 раза: ??? Будут ли создаваться клоны? Если да, то их свойства по умолчанию будут такие же, как у объекта в сцене (начального) или как у префаба, из которого этот объект был добавлен в сцену? Кроме того полагаю, они по-прежнему будут независимы.

  3. Очень ненормальная. В инспекторе мы перетаскиваем префаб нужного объекта в публичное поле спавнера в сцене. В скрипте спавнера мы изменяем значения следующим образом:
    C#
    1
    
    thingToSpawn.transform.position = Vector3.zero;
    Что при этом случится? Выходит, мы вносим изменения в сам префаб? Все существовавшие до этого клоны тоже будут подвержены этому изменению? Если да, то их перемещение будет абсолютным и одинаковым для всех, или они переместятся относительно тех точек, в которых уже были?
0
0 / 0 / 3
Регистрация: 19.03.2015
Сообщений: 207
08.10.2015, 16:20  [ТС] 10
Цитата Сообщение от Darky Посмотреть сообщение
А по теме - просто какой-то бред, в этом коде черт ногу сломит. Проблема в том, что ты делаешь
Сообщение от dobrotiu
t = g.GetComponent<test2> ();
А "g" у тебя - видимо, тот самый префаб. Тебе нужно завести переменную для
Сообщение от dobrotiu
Instantiate(lol,pos.position,pos.rotation);
из скрипта "Spawn" и ссылаться на нее, ибо это и есть экземпляр твоего клона.
Окей, я в общем понял как, есть еще один вопрос, переменную для клона создавать в типе transform или gameoject?
0
Быдлокодер
510 / 297 / 84
Регистрация: 22.11.2009
Сообщений: 892
08.10.2015, 16:33 11
Цитата Сообщение от dobrotiu Посмотреть сообщение
Окей, я в общем понял как, есть еще один вопрос, переменную для клона создавать в типе transform или gameoject?
Ну ты же игровой объект инстанциируешь. Значит, GameObject.
0
0 / 0 / 3
Регистрация: 19.03.2015
Сообщений: 207
08.10.2015, 18:34  [ТС] 12
Цитата Сообщение от Darky Посмотреть сообщение
Ну ты же игровой объект инстанциируешь. Значит, GameObject.
Немного протупил. Спасибо за объяснение.

Добавлено через 1 час 13 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using UnityEngine;
using System.Collections;
 
public class Spawn : MonoBehaviour {
    public GameObject[] mob;
    public Transform[] spwnPoint;
    public int bla;
    GameObject lol;
    Transform pos;
    public float Timer;
    test2 t;
    GameObject tlen;
    private Transform target;
      Transform gopa;
    public float hp = 100;
    blad bleat;
    public static GameObject lool;
    void Awake () {
    //  Timer += Time.time + 5;
 
    }
    void Start(){
        target = GameObject.FindGameObjectWithTag ("Player").transform;
 
        bleat = gameObject.GetComponent<blad>();
    }
 
    void Update () {
        for (int i = 0; i< bla; i++) {
            if (Timer < Time.time) {
                pos = spwnPoint[Random.Range(0,spwnPoint.Length)];
                lol = mob[Random.Range(0,mob.Length)];
                Instantiate(lol,pos.position,pos.rotation);
                Timer += Time.time + 20;
            }
 
        }
        //chlen =  Instantiate(lol,pos.position,pos.rotation);
    //  chlen =  Instantiate(lol,pos.position,pos.rotation);
 
    }
    public void testik()
    {
    
            tlen = (GameObject)Instantiate(lol,transform.position,transform.rotation);
            t= tlen.GetComponent<test2>();
            t.hp = t.hp - bleat.damage;// в этой строке ошибка
        
            
        if(t.hp<=0)
        {
            if(gameObject.name == "bot(Clone)"){
                Destroy(gameObject);
            }
        }
    }
 
}
Что я делаю не так? выдает в общем такую ошибку :
NullReferenceException: Object reference not set to an instance of an object
Spawn.testik () (at Assets/lllll/Spawn.cs:47)
blad.Update () (at Assets/lllll/blad.cs:55)

Добавлено через 28 минут
Решил проблему.

Добавлено через 47 секунд
Возникла новая.
Как теперь уничтожить клона если у него хп = 0?
0
Быдлокодер
510 / 297 / 84
Регистрация: 22.11.2009
Сообщений: 892
08.10.2015, 18:46 13
Пусть он сам смотрит, сколько у него жизней, и убивает себя, если <= 0.
0
0 / 0 / 3
Регистрация: 19.03.2015
Сообщений: 207
08.10.2015, 23:27  [ТС] 14
Цитата Сообщение от dobrotiu Посмотреть сообщение
if(t.hp<=0)
* * * * {
* * * * * * if(gameObject.name == "bot(Clone)"){
* * * * * * * * Destroy(gameObject);
* * * * * * }
* * * * }
вот как бы этот код но он не работает.
Можно попробовать * Destroy(this.gameObject);

Добавлено через 11 минут
Не получилось.

Добавлено через 4 часа 10 минут
Вот такая ошибка получается: MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Я пытаюсь понять но не могу.

Добавлено через 1 минуту
Your script should either check if it is null or you should not destroy the object. И вот что еще пишет.
0
742 / 590 / 203
Регистрация: 06.08.2015
Сообщений: 2,429
09.10.2015, 22:24 15
Создайте
C#
1
public List<GameObject> bot_list;
и в него уже добавляйте
C#
1
bot_list.Add( (GameObject) Instantiate(lol,pos.position,pos.rotation));
или удаляйте
C#
1
2
bot_list.Remove( bot_to_destroy );
Destroy( bot_to_destroy );
можно узнать количество ботов через
C#
1
bot_list.Count;
и получить доступ с помощью
C#
1
GameObject bot_list.Item[int];
ЗДЕСЬ справка по классу. Не забыть подключить System.Collections.Generic надо только.
0
0 / 0 / 3
Регистрация: 19.03.2015
Сообщений: 207
11.10.2015, 00:25  [ТС] 16
Цитата Сообщение от Cr0c Посмотреть сообщение
Код C#Выделить код
1
2
bot_list.Remove( bot_to_destroy );
Destroy( bot_to_destroy );
От куда взялась переменная bot to destroy?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2015, 00:25

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как убить клона в справочнике сотрудников
Товарищи помогите пожалуйста! 1. Есть таблица-справочник сотрудников. одну девушку занесли дважды...

Найти наибольший элемент массива В[1..6,1..4] и отнять его от всех столбцов, кроме того в каком он находиться.
Найти наибольший элемент массива В и отнять его от всех столбцов кроме того в каком он находиться.

Как получить копию префаба unity?
Здравствуйте, мне нужно получить копию префаба(до этого я пытался помещать префаб на сцену и...

Как создать объект из префаба с начальными параметрами?
Добрый вечер. Вопрос по Unity3D. При создании объекта (префаб) как проще сразу занести в скрипт...

Как создать элемент GUI на основе префаба?
Необходимо динамически создать N элементов интерфейса (в данном случае кнопок). Создаю префаб...

Как прописать значение в поле на форме , клона через KeepNewFormClone
привет , всем такой вопрос , на форме добавил поле3 в котором хочу видеть значение 100 через клон...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.