Форум программистов, компьютерный форум, киберфорум
Наши страницы
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Vla00
7 / 7 / 9
Регистрация: 06.10.2012
Сообщений: 546
1

Отключение объекта

12.09.2015, 12:58. Просмотров 992. Ответов 11
Метки нет (Все метки)

Я создал Terraine. На его повесил скрипт появления ботов каждые 10 секунд.
Но когда убиваю главного бота, сразу генерация останавливается. Как исправить?
Отключение объекта
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2015, 12:58
Ответы с готовыми решениями:

Поворот объекта относительно другого объекта 2D
Делаю игру с видом сверху и нужно чтобы стрела от лучника вылетала перьями...

Вращение объекта вокруг другого объекта
Как сделать вращение объекта вокруг другого объекта? Например: создаём куб,...

Можно ли вызвать метод одного объекта через метод другого объекта?
Мне нужно сделать так, чтобы при вызове метода OnMouseDown() Первого объекта...

Отключение дочерних объектов
Есть панель,в панели находятся дочерние кнопки,нужно делать их из скрипта...

Включение и отключение гравитации
Есть 5-7 префабов(c Rigidbody2D) при старте они висят в воздухе,при нажатии на...

11
Cr0c
551 / 452 / 164
Регистрация: 06.08.2015
Сообщений: 1,935
Завершенные тесты: 2
12.09.2015, 13:34 2
Зашибись мы телепаты! Без кода ошибку в нем найти можем!
0
Vla00
7 / 7 / 9
Регистрация: 06.10.2012
Сообщений: 546
12.09.2015, 17:16  [ТС] 3
Цитата Сообщение от Cr0c Посмотреть сообщение
Зашибись мы телепаты! Без кода ошибку в нем найти можем!
Какой именно код скидывать?

Добавлено через 27 секунд
Цитата Сообщение от Cr0c Посмотреть сообщение
Зашибись мы телепаты! Без кода ошибку в нем найти можем!
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
public class StartBotRandom : MonoBehaviour {
 
    public int radiusPlayer;        //радиус спауна мостра
    public float TimeNextRespaun;   //время спауна
    public Transform mob;           //намш моб
    public Transform player;        //игрок
    private float spawnRate = 2;    //для вычисления времени появления моба
 
    // Update is called once per frame (постоянно обновляющая функция "зацикленная")
    void Update () {
        //если время расположения бота меньше чем нужно, мы приступаем к вычислению его позиции и ставим на нашу карту.
        if (TimeNextRespaun < Time.time)
        {
            Spawn();
            TimeNextRespaun = Time.time + spawnRate;
            spawnRate *= 0.98f;
            spawnRate = Mathf.Clamp(spawnRate, 0.3f, 99f);
        }
    }
 
    void Spawn()
    {
        try
        {
            //определяем рандомную позицию бота
            var random = Random.insideUnitCircle.normalized * radiusPlayer;
            //определяем позацию бота
            Vector3 positionBot = new Vector3(player.transform.position.x + random.x, player.transform.position.y + random.y, player.transform.position.z + random.y);
            //размещаем нашего бота на определенную нами позацию
            Instantiate(mob, positionBot, Quaternion.identity);
        }
        catch
        {
        }
    }
}
0
Cr0c
551 / 452 / 164
Регистрация: 06.08.2015
Сообщений: 1,935
Завершенные тесты: 2
12.09.2015, 19:14 4
Возможно потому, что уничтожается моб, на который ссылается public Transform mob;
Vector3 positionBot = new Vector3(player.transform.position.x + random.x, player.transform.position.y + random.y, player.transform.position.z + random.y);
Тут нет ошибки? Y-позицию надо ли задавать случайно, это же высота?
C#
1
Instantiate(mob, positionBot, Quaternion.identity);
вместо Transform лучше передавать GameObject, все таки
скрипта с убийством моба нет, вдруг Вы там не моба, а префаб убиваете?
0
Vla00
7 / 7 / 9
Регистрация: 06.10.2012
Сообщений: 546
13.09.2015, 16:01  [ТС] 5
Цитата Сообщение от Cr0c Посмотреть сообщение
Возможно потому, что уничтожается моб, на который ссылается public Transform mob;
Vector3 positionBot = new Vector3(player.transform.position.x + random.x, player.transform.position.y + random.y, player.transform.position.z + random.y);
Тут нет ошибки? Y-позицию надо ли задавать случайно, это же высота?
Код C#Выделить код
1
Instantiate(mob, positionBot, Quaternion.identity);
вместо Transform лучше передавать GameObject, все таки
скрипта с убийством моба нет, вдруг Вы там не моба, а префаб убиваете?
Переделал немного. Исправил сразу несколько своих ошибок. все сделал через префаб. Игрока размещаю начально через код.
C#
1
2
3
4
5
6
7
8
    public Transform player;        //игрок
    private float spawnRate = 2;    //для вычисления времени появления моба
 
    void Start()
    {
        Vector3 pos = new Vector3(300f, 320f, 4165f);
        Instantiate(player, pos, Quaternion.identity);
    }
Но у меня есть логика когда бот появляется он сразу начинает атаковать игрока:
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
public class AtackBot : MonoBehaviour {
 
    public Transform mob;           //наш моб
    public Transform player;        //игрок
    public float speedMonster;      //скорость монстра
    
    // Update is called once per frame
    void Update () {
        //поворачиваем нашего бота на игрока
        transform.LookAt(player);
        //начинаем двигаться к игроку
        mob.transform.Translate(0, 0, speedMonster);
        //включаем анимацию движения
        animation.Play("Run");
        Atack();
    }
 
    void Atack()
    {
        RaycastHit hit;
        Vector3 Ray = transform.TransformDirection(Vector3.forward);
        //получаем данные которые у нас в прицеле
        if (Physics.Raycast(transform.position, Ray, out hit, 5))
        {
            //если наша пуля столкнулась с тего "Bot"
            if (hit.collider.tag == "Player")
            {
                animation.Stop();
                Invoke("Bite", 1);
            }
        }
    }
 
    void Bite()
    {
        animation.Play("Bite2");
        Debug.Log("1");
    }
}
Я указал в player игрока (префаб). И боты начинают атаковать то место где игрок первоначально появляется. Как сделать что-бы они атаковали позицию где я нахожусь на данный момент?
0
Cr0c
551 / 452 / 164
Регистрация: 06.08.2015
Сообщений: 1,935
Завершенные тесты: 2
13.09.2015, 19:14 6
Хоть убей, не пойму, почему трансформ, а не GameObject внутри Instatiate?
Во втором скрипте ссылка public Transform player; //игрок указывает на Instantiate(player, pos, Quaternion.identity); или на префаб?

public static Object Instantiate(Object original, Vector3 position, Quaternion rotation);
0
Vla00
7 / 7 / 9
Регистрация: 06.10.2012
Сообщений: 546
13.09.2015, 20:02  [ТС] 7
Цитата Сообщение от Cr0c Посмотреть сообщение
Во втором скрипте ссылка public Transform player; //игрок указывает на Instantiate(player, pos, Quaternion.identity); или на префаб?
На префаб.
Цитата Сообщение от Cr0c Посмотреть сообщение
Хоть убей, не пойму, почему трансформ, а не GameObject внутри Instatiate?
Если допустим я делаю его GameObject то как мне его повернуть на игрока? а так я его поворачиваю командой transform.LookAt(player);
0
Cr0c
551 / 452 / 164
Регистрация: 06.08.2015
Сообщений: 1,935
Завершенные тесты: 2
14.09.2015, 00:30 8
Цитата Сообщение от Vla00 Посмотреть сообщение
На префаб.
И чему удивляться тогда? Префаб не присутствует на сцене, это источник клонов. Надо работать с клоном, ссылку на который возвращает
C#
1
Instantiate(player, pos, Quaternion.identity);
Цитата Сообщение от Vla00 Посмотреть сообщение
Если допустим я делаю его GameObject то как мне его повернуть на игрока? а так я его поворачиваю командой transform.LookAt(player);
В public надо задавать только то, что не надо будет искать ручками каждый раз ИЛИ поля для доступа из других скриптов для приема/передачи данных. Выход таков:
C#
1
2
3
4
5
6
7
8
public GameObject playerGO;        // игрок
private Transform goTransform;
void Update();
{
if  goTransform = playerGO.transform; // если трансформ пустой - берем его из playerGO
if (goTransform = null) return; // если ГО ещё не передали в скрипт - выходим из функции
// делаем всё что надо
}
В скрипте после создания игрока: передаём ссылку на ГО игрока в скрипт для ботов:
C#
1
GameObject.Find("ГО-со-скриптом-AtackBot").GetComponent<AtackBot>().playerGO = ГО_игрока;
0
Vla00
7 / 7 / 9
Регистрация: 06.10.2012
Сообщений: 546
14.09.2015, 00:59  [ТС] 9
Цитата Сообщение от Cr0c Посмотреть сообщение
скрипте после создания игрока: передаём ссылку на ГО игрока в скрипт для ботов:
Неособо понял. Вообщем я создал 2 префаба игрок и бот. На террейне висит скрипт создания ботов и одно появление игрока. На префабе бота висит скрипт атаки.
Когда я появился и перешел в другую точку, боты атакуют по тем координатам, где находится префаб игрока, а не реальные его координаты.
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
public class StartBotRandom : MonoBehaviour {
 
    public int radiusPlayer;        //радиус спауна мостра
    public float TimeNextRespaun;   //время спауна
    public GameObject mob;           //намш моб
    public GameObject player;        //игрок
    private float spawnRate = 2;    //для вычисления времени появления моба
 
    void Start()
    {
        Vector3 pos = new Vector3(300f, 320f, 4165f);
        Instantiate(player, pos, Quaternion.identity);
    }
 
    // Update is called once per frame (постоянно обновляющая функция "зацикленная")
    void Update () {
        //если время расположения бота меньше чем нужно, мы приступаем к вычислению его позиции и ставим на нашу карту.
        if (TimeNextRespaun < Time.time)
        {
            Spawn();
            TimeNextRespaun = Time.time + spawnRate;
            spawnRate *= 0.98f;
            spawnRate = Mathf.Clamp(spawnRate, 0.3f, 99f);
        }
    }
 
    void Spawn()
    {
        try
        {
            //определяем рандомную позицию бота
            var random = Random.insideUnitCircle.normalized * radiusPlayer;
            //определяем позацию бота
            Vector3 positionBot = new Vector3(player.transform.position.x + random.x, 400, player.transform.position.z + random.y);
            //размещаем нашего бота на определенную нами позицию
            Instantiate(mob, positionBot, Quaternion.identity);
        }
        catch
        {
        }
    }
}
Добавлено через 9 минут
Решил немного по другому сделать:
C#
1
2
3
4
private void Awake()
    {
        player = GameObject.Find("Player(Clone)").transform;
    }
Это написал в скрипте атаки.
0
Cr0c
551 / 452 / 164
Регистрация: 06.08.2015
Сообщений: 1,935
Завершенные тесты: 2
14.09.2015, 07:56 10
Что такое префаб
Спавнер мобов можно на камеру повесить, а логику ботов в бота воткнуть, а бота в префаб.
Instantiate(player, pos, Quaternion.identity); создаёт новый объект при каждом вызове и возвращает ссылку на него. И покажи код создания игрока.
0
Vla00
7 / 7 / 9
Регистрация: 06.10.2012
Сообщений: 546
14.09.2015, 11:47  [ТС] 11
Цитата Сообщение от Cr0c Посмотреть сообщение
И покажи код создания игрока.
Создание игрока и потом ботов:
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
public int radiusPlayer;
    public float TimeNextRespaun;
    public GameObject mob;
    public GameObject player;
    private float spawnRate = 2;
 
    void Start()
    {
        Vector3 pos = new Vector3(300f, 320f, 4165f);
        Instantiate(player, pos, Quaternion.identity);
    }
 
    // Update is called once per frame (постоянно обновляющая функция "зацикленная")
    void Update () {
        if (TimeNextRespaun < Time.time)
        {
            Spawn();
            TimeNextRespaun = Time.time + spawnRate;
            spawnRate *= 0.98f;
            spawnRate = Mathf.Clamp(spawnRate, 0.3f, 99f);
        }
    }
 
    void Spawn()
    {
        try
        {
            var random = Random.insideUnitCircle.normalized * radiusPlayer;
            Vector3 positionBot = new Vector3(player.transform.position.x + random.x, 400, player.transform.position.z + random.y);
            Instantiate(mob, positionBot, Quaternion.identity);
        }
        catch
        {
        }
    }
0
Cr0c
551 / 452 / 164
Регистрация: 06.08.2015
Сообщений: 1,935
Завершенные тесты: 2
14.09.2015, 12:19 12
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
public int radiusPlayer;
* * public float TimeNextRespaun;
* * public GameObject mob;
* * public GameObject playerPrefab; // сюда префаб
* * public GameObject player; // здесь будет ссылка на го игрока
* * private float spawnRate = 2;
void Start()
* * {
* * * * Vector3 pos = new Vector3(300f, 320f, 4165f);
* * * * player = Instantiate(playerPrefab, pos, Quaternion.identity);
* * }
// Update is called once per frame (постоянно обновляющая функция "зацикленная")
* * void Update () {
* * * * if (TimeNextRespaun < Time.time)
* * * * {
* * * * * * Spawn();
* * * * * * TimeNextRespaun = Time.time + spawnRate;
* * * * * * spawnRate *= 0.98f;
* * * * * * spawnRate = Mathf.Clamp(spawnRate, 0.3f, 99f);
* * * * }
* * }
void Spawn()
* * {
* * * * try
* * * * {
* * * * * * var random = Random.insideUnitCircle.normalized * radiusPlayer;
* * * * * * Vector3 positionBot = new Vector3(player.transform.position.x + random.x, 400, player.transform.position.z + random.y);
* * * * * * Instantiate(mob, positionBot, Quaternion.identity);
* * * * }
* * * * catch
* * * * {
* * * * }
* * }
0
14.09.2015, 12:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2015, 12:19

Отключение гравитации в Unity
Здравствуйте. У меня на сцене есть объект с прикрученным к нему RidgidBody и...

Отключение определения нажатий
Здравствуйте. Мне нужно полностью отключить свою игру в определённый момент от...

Отключение коллайдеров при прыжке
Здравствуйте! Нужна ваша помощь. Работаю над 2D игрой где персонаж летит вверх...


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

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

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