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

Создание объекта из префаба по клику мыши

04.10.2016, 11:25. Просмотров 3834. Ответов 2
Метки нет (Все метки)


Здравствуйте, такая ситуация:
Есть скрипт MousePoint, прикрепленный к кнопке постройки через gameobject BuildTower. Суть скрипта в том, что после нажатия кнопки мы тянем за мышкой так называемый ghostunit - для примерки того, где построить здание. Скрипт выглядит таким образом:
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
public class MousePoint : MonoBehaviour {
    public GameObject Target;
    public RaycastHit hit;
    float raycastlengh = 100f;
    public bool isOnTower;
    public void FindBuildingUnits ()
    {
        Target = GameObject.FindGameObjectWithTag ("BuildingUnit");
        if (Target)
            Debug.Log ("Инициализация строительства");
        else
            Debug.LogError ("Инициализация строительства не удается");
    }
    public void MousePointer ()
    {
 
        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
        if ((Physics.Raycast (ray, out hit, raycastlengh))&&(Target!=null))
            {
                Debug.Log (hit.collider.name);
            if ((hit.collider.tag == "BuildPlace")&&(Target.tag =="BuildingUnit"))
                {
                isOnTower = false;
                Target.transform.position = hit.transform.position + new Vector3 (0, 0.3f, 0);
                }
            if (hit.collider.tag == "BuildedUnit")
                isOnTower = true;
            }
        if (Input.GetMouseButtonDown (0))
            Destroy (Target);
    }
    void Update () {
        FindBuildingUnits ();
        if (Target != null) {
            MousePointer ();
        }
    }
}
Т.е. понятно, надеюсь, если во фрейме замечен объект с тегом BuildingUnit, то мы его делаем целью и катаем по месту постройки указателем мыши, по нажатию лкм - объект удаляется. Чтобы объект выглядел соответствующе (как призрак) необходимо ему ghost материал прописать - это все сделано, объект создается с нужным материалом и т.д. До этого этапа - все работает:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class BuildTower : MonoBehaviour {
    public GameObject GhostTower;
    public void BuildingTower (GameObject Tower)
    {
        GhostTower = GameObject.Instantiate (Resources.Load (Tower.GetComponent<UnitInfo> ().Name) as GameObject);
        GhostTower.tag = "BuildingUnit";
        GhostTower.GetComponent<Renderer> ().material = GhostTower.GetComponent<UnitInfo> ().GhostMaterial;
        if (GetComponent<MousePoint> ().isOnTower)
        {
            GhostTower.GetComponent<Renderer> ().material = GhostTower.GetComponent<UnitInfo> ().CancelMaterial;
        }
    }
Теперь следующее:
То, что дальше делать - я не пойму. Необходимо удалить объект с ghost материалом и создать объект с normal материалом. И вроде бы я сделал следующий скрипт
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class BuildedTower : MonoBehaviour {
    GameObject GhostTower;
    GameObject Target;
    public void Builded (GameObject Tower)
    {
        Target = GameObject.FindGameObjectWithTag ("BuildingUnit");
        Vector3 pos = Target.transform.position;
        if (Target != null)
        {
            if (Input.GetMouseButtonDown (0)) {
            
 
            GhostTower = GameObject.Instantiate (Resources.Load (Tower.GetComponent<UnitInfo> ().Name) as GameObject);
            GhostTower.tag = "BuildedUnit";
            GhostTower.GetComponent<Renderer> ().material = GhostTower.GetComponent<UnitInfo> ().NormalMaterial;
            GhostTower.transform.position = pos;
        }
    }
    }
}
Собственно, у меня вопрос: каким образом мне проверку нажатия лкм сделать так, чтобы эта самая проверка была уже после того, как удаляется ghost объект? Одним словом, этот скрипт делает приблизительно "ничего". Помогите, пожалуйста, разобраться, уже пару дней мучаюсь

Добавлено через 33 минуты
Быстренько добавлю:
Если в последнем скрипте оставить так, как есть все - то при нажатии на лкм создаются сразу 2 объекта (гост и обычный).
Необходимо, чтобы создавался только гост, а при втором нажатии на клавишу - создавался обычный.
Короч, как я понимаю, проблема в том, что обработчик нажатия кнопки сразу же обрабатывает 2 скрипта - создания госта и создания обычного объекта. Собственно, вопрос в том, как сделать так, чтобы скрипт создания обычного объекта обрабатывался строго после удаления госта?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2016, 11:25
Ответы с готовыми решениями:

Движение объекта на плоскости по клику мыши
Приветствую! Пытаюсь по клику мыши заставить объект двигаться. Через Ray получил точку пересечения...

Создание объекта по клику мышки
И еще раз доброго времени! Есть скрипт, отвечающий за постройку башни на кубике (нажали на кубик -...

Создание объекта по клику мышки
Доброго времени суток, уважаемые форумчане. Начал разбираться с юнити3д, такая задача стоит...

Вылет объекта из префаба
Доброй ночи господа, встал вот такой вопрос почему не вылетает куб из префаба, в префаб поместил...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы геймдизайнеров
2
101 / 88 / 19
Регистрация: 15.04.2015
Сообщений: 353
04.10.2016, 11:46 2
Почему бы не поставить простую логическую проверку? Проверять, имеется ли у вас ваш "ghost" (насколько я понял, это "маркер постройки"). Если нет - создать его. Если есть - убрать его и создать реальный объект. Одной булевской переменной хватит.
1
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 116
04.10.2016, 12:19  [ТС] 3
Буду пробовать таким образом реализовать - банально скриптов меньше получится. Вопрос в другом:
Вот представим, что я хочу сделать такой универсальный код постройки, чтобы префаб можно было выбирать при прикреплении к кнопке (на событие онклик). Т.е. я прописываю функцию, например Build (GameObject Unit) Вопрос такого характера:
Как мне можно вызывать функцию эту? Ведь аргументы (префабы юнитов) всегда будут разные, нужно одно и то же вытаскивать оттуда
Можно было бы конечно паблик gameobject сделать, но тогда для каждого юнита нужно будет писать скрипт, а я хочу как бы унифицировать процесс постройки
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2016, 12:19

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

Создание префаба Instaniate
Здравствуйте, помогите пожалуйста есть префаб в ассете нужно создать пустой обьект и повесить на...

Создание префаба террейна
Создаю динамически землю, сохраняю в префаб. Префаб создается пустой - terraindata не сохраняется,...

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

Реакция объекта по клику мыши
По примеру Кучки пытался сделать Я не могу врубиться как делается выделение и перетаскивание если...


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

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

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