Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+3

Помогите с кодом C# для unity

Всем привет, делаю мобильное управление в чужом проекте и не могу понять как его сделать, сделал специальный скрипт который определяет включена ли кнопка ga, чтобы увеличить объект objectToScale и чтобы когда ga перестал работать тот в свою очередь уменьшился, но это не работает, помогите пожалуйста исправить.

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class DrugoyButton : MonoBehaviour, IPointerDownHandler
{
private bool isPressed = false;

public GameObject objectToScale;
public GameObject ga;

public void OnPointerDown(PointerEventData eventData)
{
if (eventData.pointerEnter == ga)
{
isPressed = true;
objectToScale.transform.localScale += new Vector3(1.2f, 1.2f, 1.2f);
}
}

public void OnPointerUp(PointerEventData eventData)
{
if (eventData.pointerEnter == ga)
{
isPressed = false;
objectToScale.transform.localScale -= new Vector3(1.2f, 1.2f, 1.2f);
}
}

private void Update()
{
if (isPressed)
{
objectToScale.transform.localScale += new Vector3(0, 0 * Time.deltaTime, 0);
}
}
}

По дате
По рейтингу
Аватар пользователя
Мастер

Твой класс реализует только IPointerDownHandler, но не реализует IPointerUpHandler. Для отслеживания момента отпускания кнопки, тебе нужно также реализовать интерфейс IPointerUpHandler.

В методе Update ты пытаешься изменить размер объекта, но у тебя стоит нулевое значение умножения. Также, постоянно увеличивать или уменьшать размер в Update может привести к непредсказуемым результатам из-за разных скоростей обновления кадров. Если ты хочешь плавно изменять размер, нужно использовать плавное изменение размера (Lerp).

Увеличивать и уменьшать localScale на фиксированное значение может привести к нежелательным эффектам, особенно если ты начинаешь с неединичного масштаба.

Попробуй так:


1234567891011121314151617181920212223242526272829303132333435363738394041424344
 using UnityEngine; 
using UnityEngine.UI; 
using UnityEngine.EventSystems; 
 
public class DrugoyButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler 
{ 
    private bool isPressed = false; 
    public GameObject objectToScale; 
    public GameObject ga; 
 
    public void OnPointerDown(PointerEventData eventData) 
    { 
        if (eventData.pointerEnter == ga) 
        { 
            isPressed = true; 
            StartCoroutine(ScaleOverTime(objectToScale.transform, objectToScale.transform.localScale * 1.2f, 0.5f)); 
        } 
    } 
 
    public void OnPointerUp(PointerEventData eventData) 
    { 
        if (eventData.pointerEnter == ga && isPressed) 
        { 
            isPressed = false; 
            StartCoroutine(ScaleOverTime(objectToScale.transform, objectToScale.transform.localScale / 1.2f, 0.5f)); 
        } 
    } 
 
    private IEnumerator ScaleOverTime(Transform targetTransform, Vector3 targetScale, float duration) 
    { 
        Vector3 originalScale = targetTransform.localScale; 
        float time = 0f; 
 
        while (time < duration) 
        { 
            targetTransform.localScale = Vector3.Lerp(originalScale, targetScale, time / duration); 
            time += Time.deltaTime; 
            yield return null; 
        } 
 
        targetTransform.localScale = targetScale; 
    } 
} 
 

Теперь твой класс сможет правильно обрабатывать события нажатия и отпускания кнопки.
Используется корутина для плавного изменения размера объекта, что более надежно и красиво, чем прямое изменение в Update.
Проверка isPressed в OnPointerUp предотвращает нежелательные изменения размера при неверных событиях.

Аватар пользователя
Гений

Вызываешь такой слесаря кран починить. Он пришел, пожал плечами, сказал что не разбирается в кранах, взял деньги и ушел.