Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
4 / 3 / 2
Регистрация: 03.12.2023
Сообщений: 116

ToggleOn и сброс состояния кнопки

25.12.2023, 23:59. Показов 659. Ответов 1

Студворк — интернет-сервис помощи студентам
Добрый день!
Опишу действие:
По нажатии кнопки на канвасе, вызывается ToggleOn: Персонаж берет коробку(targetObject), она монтируется в руку, все хорошо.
По нажатии той-же кнопки на канвасе вызывается ToggleOff: Персонаж отпускает коробку.
Подъем коробки и отпускание коробки реализовано вкратце так:

Первое нажатие- взять в руки:
C#
1
2
3
4
5
6
7
public void ToggleOn() //первое нажатие кнопки- взять
...//тут поиск коробки, если условия выполняются, то делаем действие...
        targetObject.GetComponent<Rigidbody>().useGravity = false; //отключаем гравитацию коробке
        targetObject.GetComponent<Rigidbody>().isKinematic = true; //Кинематик у коробки вкл
        targetObject.position = this.Hands.transform.position; //Притянуть коробку в руки
        targetObject.transform.parent = this.Hands.transform; //Удочерить коробку
        _animator.SetBool("drag", true); //анимация- теперь таскающий
Второе нажатие- положить:
C#
1
2
3
4
5
6
7
public void ToggleOff() //второе нажатие кнопки- отпустить
    {
        targetObject.transform.parent = null; //отказаться от родительства коробки
        targetObject.GetComponent<Rigidbody>().useGravity = true; //на коробку действует гравитация
        targetObject.GetComponent<Rigidbody>().isKinematic = false; //коробка не кинематик
        _animator.SetBool("drag", false); //анимация- больше не таскающий
    }
Сделал отдельный скрипт разрушения коробки- персонаж, по нажатию другой кнопки на канвасе может разрушить коробку:
C#
1
2
3
4
public void OnClick() //при нажатии выполняем разрушение коробки (в руках или лежачей)
...//поиск коробки, если условия выполняются, то делаем действие...      
        Destroy(targetObject); //уничтожить ящик
        _animator.SetBool("drag", false); //анимация- больше не таскающий
Так-же другой игрок/бот может разбить коробку моему персонажу, когда она в руках. Тогда отработает скрипт по уничтожению коробки. Всё хорошо, но новую коробку я не могу взять, т.к. ToggleOff в первом скрипте не выполнен (положить коробку), т.к. коробки больше нет.
В консоли говорит- "вы пытаетесь влиять на коробку, но коробки нет."

Извиняюсь, многобукав... Постараюсь короче:
ToggleOn выполнили
Возникли обстоятельства, когда не могу выполнить ToggleOff. Как можно сбросить состояние кнопки?

Добавлено через 29 минут
Или при попытке второго нажатия проверять есть ли коробка?:

public void ToggleOff()
Если targetObject нет, то ToggleOff выполнено без других условий.
Если targetObject есть, то выполняем обычное положить коробку:
{
targetObject.transform.parent = null; //отказаться от родительства коробки
targetObject.GetComponent<Rigidbody>().u seGravity = true; //на коробку действует гравитация
targetObject.GetComponent<Rigidbody>().i sKinematic = false; //коробка не кинематик
_animator.SetBool("drag", false); //анимация- больше не таскающий
}

Как это можно сделать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.12.2023, 23:59
Ответы с готовыми решениями:

Сброс toogle состояния кнопки через usart
Пытаюсь подключить Ардуино к последовательному порту. Читаю - пишу данные нормально. Но необходимо выполнить логику и не пойму, как...

Сброс состояния программы
Коллеги, вновь столкнулся с вопросом, который частенько у меня всплывает: как сбросить состояние программы? Другими словами, необходимо...

Сброс состояния буфера cin.clear
Всем привет. Пытаюсь контролировать ввод пользователя. Вопрос в следующем: почему очерёдность операций принципиальна : #include...

1
4 / 3 / 2
Регистрация: 03.12.2023
Сообщений: 116
26.12.2023, 14:28  [ТС]
Немного переделал. Оба скрипта в один.
3 функции:
Взять ящик (ToggleOn)
Положить ящик (ToggleOff)
Уничтожить ящик (Destroy)

Пока проблема та-же, если коробка уничтожена, надо завешрить цикл (ToggleOff) без условий.

Полный скрипт:
Кликните здесь для просмотра всего текста
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
71
72
73
74
75
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
 
public class BoxPickup3 : MonoBehaviour
{
    private Transform targetObject; //ящик для взять\поставить
    private GameObject targetBox; //ящик для функции уничтожения
    private Transform Hands; //рука
    public List<Transform> boxes; //Список коробок
    public Animator _animator; // Подключаем аниматор
 
    private void Start()
    {
        Hands = this.gameObject.transform.Find("BaseCharacter/Hands"); //Говнокод
        targetObject = GameObject.FindWithTag("Box").transform; //Таргет назначена коробка по тегу!!!
    }
    private void OnTriggerStay(Collider other) //Enter. Stay- тормоза или тогда ограничить список 10шт, возможно ошибка по переполнению будет
    {
        if (other.gameObject.tag == "Box" && other != null) boxes.Add(other.transform); //если (объект имеет тэг Коробка и тэг не пустой) в список коробок добавить (координаты этого(?) объекта)
    }
    private void OnTriggerExit(Collider other)
    {
        boxes.Clear();
    }
    public void ToggleOn()
    {
        float minDistance = Vector3.Distance(transform.position, boxes[0].transform.position); //ближайший
        int tmpI = 0;
        for (int i = 1; i < boxes.Count; i++) //счет по 1; количество меньше содержимого списка; добавить +1
        {
            if (boxes[i] != null) //если коробок не 0
            {
                if (Vector3.Distance(transform.position, boxes[i].transform.position) < minDistance) //если от руки до числа номера из списка коробок расстояние меньше заданного ближайшего 
                {
                    minDistance = Vector3.Distance(transform.position, boxes[i].transform.position); //назначаем ближайший
                    tmpI = i;
                }
                if (i == boxes.Count - 1) targetObject = boxes[tmpI].transform;
            }
        }
        targetObject.GetComponent<Rigidbody>().useGravity = false;
        targetObject.GetComponent<Rigidbody>().isKinematic = true;
        targetObject.position = this.Hands.transform.position; //Hands
        targetObject.transform.parent = this.Hands.transform; //Hands
        _animator.SetBool("drag", true); //анимация рук
    }
    public void ToggleOff()
    {
        targetObject.transform.parent = null;
        targetObject.GetComponent<Rigidbody>().useGravity = true;
        targetObject.GetComponent<Rigidbody>().isKinematic = false;
        _animator.SetBool("drag", false); //анимация рук
    }
    public void Destroy() //уничтожение по клику
    {
        float minDistance = Vector3.Distance(transform.position, boxes[0].transform.position); //ближайший
        int tmpI = 0;
        for (int i = 1; i < boxes.Count; i++) //счет по 1; количество меньше содержимого списка; добавить +1
        {
            if (boxes[i] != null) //если коробок не 0
            {
                if (Vector3.Distance(transform.position, boxes[i].transform.position) < minDistance) //если от руки до числа номера из списка коробок расстояние меньше заданного ближайшего 
                {
                    minDistance = Vector3.Distance(transform.position, boxes[i].transform.position); //назначаем ближайший
                    tmpI = i;
                }
                if (i == boxes.Count - 1) targetBox = boxes[tmpI].gameObject;
            }
        }
        Destroy(targetBox); //уничтожить ящик
        _animator.SetBool("drag", false); //анимация рук
    }
}


Добавлено через 1 час 17 минут
Получилось выполнить ToggleOff без условий, всё огонь!

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void ToggleOff()
{
    if (targetObject != null)
    {
        targetObject.transform.parent = null;
        targetObject.GetComponent<Rigidbody>().useGravity = true;
        targetObject.GetComponent<Rigidbody>().isKinematic = false;
        _animator.SetBool("drag", false); //анимация рук
        print("Ящик положили нормально");
    }
    else
    {
        print("Ящика нет, в else надо что то прописать. Или и так выполнится, принт же есть, его и выполнит");
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.12.2023, 14:28
Помогаю со студенческими работами здесь

ADXL345 сброс состояния ноги прерывания (INT1, INT2)
Доброго времени года! Пытаюсь работать с акселерометром ADXL345 и возникли проблемы с его прерываниями. Не получается сбросить состояние...

Сброс действия кнопки
Здравствуйте, работаю с SQL, при нажатии кнопки добавляется новый пользователь. Если дальше ввести другого пользователя и нажать добавить...

Переключение состояния кнопки
помогите сделать: 3. Три состояния кнопки (3 рис на кнопку), т.е. переключение рисунков кнопок – (4- кнопки) 1. показ-скрытие слоя,...

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

Изменение состояния кнопки
В одной из таблиц есть поле true/false необходимо чтобы при значении true - были доступны одни кнопки, при значении false - другие. ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru