C # GUI текстурный скрипт кнопки - PullRequest
0 голосов
/ 04 октября 2011

Я наконец нашел скрипт, который можно использовать с кнопкой GUI в проекте IOS. Я использую игровой движок Unity3d. Я немного знаком с кнопками JavaScript и анимацией, но совсем не знаком с C #. Моя проблема заключается в том, что я не знал, написать ли функцию, которая будет воспроизводить анимацию в очереди в скрипте кнопки C # при нажатии кнопки. Ниже приведена копия скрипта кнопки IOS, а затем код, необходимый для воспроизведения анимации в очереди.

using UnityEngine;
using System.Collections;

public enum Btn
{
    normal,
    hover,
    armed
}

[System.Serializable] // Required so it shows up in the inspector 
public class ButtonTextures
{
    public Texture normal=null;
    public Texture hover=null;
    public Texture armed=null;
    public ButtonTextures() {}

    public Texture this [ButtonState state]
    {
        get
        {
            switch(state)
            {
                case ButtonState.normal:
                    return normal;
                case ButtonState.hover:
                    return hover;
                case ButtonState.armed:
                    return armed;
                default:
                    return null;
            }
        }
    }
}


[RequireComponent(typeof(GUITexture))]
[AddComponentMenu ("GUI/Button")]    
public class GuiButton : MonoBehaviour
{
    public GameObject messagee;
    public string message = "";
    public string messageDoubleClick = "";
    public ButtonTextures textures;

    protected int state = 0;
    protected GUITexture myGUITexture;

    private int clickCount = 1;
    private float lastClickTime = 0.0f;
    static private float doubleClickSensitivity = 0.5f;

    protected virtual void SetButtonTexture(ButtonState state)
    {
        if (textures[state] != null)
        {
            myGUITexture.texture = textures[state];
        }
    }

    public virtual void Reset()
    {
        messagee = gameObject;
        message = "";
        messageDoubleClick = "";
    }

    public bool HitTest(Vector2 pos)
    {
        return myGUITexture.HitTest(new Vector3(pos.x, pos.y, 0));
    }

    public virtual void Start()
    {
        myGUITexture = GetComponent(typeof(GUITexture)) as GUITexture; 
        SetButtonTexture(ButtonState.normal);
    }

    public virtual void OnMouseEnter()
    {
        state++;
        if (state == 1)
        SetButtonTexture(ButtonState.hover);
    }

    public virtual void OnMouseDown()
    {
         state++;
         if (state == 2)
            SetButtonTexture(ButtonState.armed);
    }

    public virtual void OnMouseUp()
    {
        if (Time.time - lastClickTime <= doubleClickSensitivity)
        {
            ++clickCount;
        }
        else
        {
            clickCount = 1;
        }

        if (state == 2)
        {
            state--;
            if (clickCount == 1)
            {
                if (messagee != null && message != "")
                {
                    messagee.SendMessage(message, this);
                }
            }
            else
            {
                if (messagee != null && messageDoubleClick != "")
                {
                    messagee.SendMessage(messageDoubleClick, this);
                }
            }
        }
        else
        {
            state --;
            if (state < 0)
                state = 0;
        }
        SetButtonTexture(ButtonState.normal);
        lastClickTime = Time.time;
    }

    public virtual void OnMouseExit()
    {
        if (state > 0)
            state--;
        if (state == 0)
            SetButtonTexture(ButtonState.normal);
    }

#if (UNITY_IPHONE || UNITY_ANDROID)
    void Update()
    {
        int count = Input.touchCount;
        for (int i = 0; i < count; i++)
        {
            Touch touch = Input.GetTouch(i);
            if (HitTest(touch.position))
            {
                if (touch.phase == TouchPhase.Ended || touch.phase ==      TouchPhase.Canceled)
                {
                    SetButtonTexture(ButtonState.normal);
                }
                else
                {
                    SetButtonTexture(ButtonState.armed);
                }
                if (touch.phase == TouchPhase.Began)
                {
                    if (touch.tapCount == 1)
                {
                    if (messagee != null && message != "")
                    {
                        messagee.SendMessage(message, this);
                    }
                    }
                    else if (touch.tapCount == 2)
                    {
                        if (messagee != null && messageDoubleClick != "")
                        {
                            messagee.SendMessage(messageDoubleClick, this);
                        }
                    }
                }
                break;
            }
        }
    }
#endif
}

Большая часть этого, похоже, имеет дело с состояниями кнопок, где моя сенсорная кнопка имеет только одно состояние, которое является «нормальным». Должны ли быть удалены ссылки на «зависание» и «вооруженный»? Я также получаю сообщение об ошибке в консоли: "тип или пространство имен" Состояние кнопки "не может быть найден. Вам не хватает директивы using или ссылки на сборку?"

Код для C # GUI Кнопка воспроизведения анимации в очереди, которую я хочу вставить, выглядит следующим образом:

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    void Update() {
        if (Input.GetButtonDown("Btn"))
            animation.PlayQueued("shoot", QueueMode.PlayNow);

    }
}

Я полагаю, фрагмент сценария анимации в очереди; Input.GetButtondown .... изменится на

* * 1010

и вставляется в строку 148 сценария кнопки GUI. Пожалуйста, помогите мне, если вы можете, я чувствовать разбитым. Шутки в сторону! Любая помощь в переформатировании этого скрипта будет принята с благодарностью и используется в качестве шаблона, так как у меня есть две другие кнопки GUI для настройки. Может быть, много спрашивать или для чего рай?

почтение,

Цифровой D

аналог человек, в цифровом мире

1 Ответ

0 голосов
/ 04 октября 2011

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

Так что-то вроде (вы можете сделать это вJS, если хотите):

public class ShootyMan : MonoBehaviour {
  public void Shoot() {
    animation.PlayQueued("shoot", QueueMode.PlayNow);
  }
}

Теперь посмотрите на кнопку в инспекторе.Я не уверен, знакомы ли вы с тем, как работает обмен сообщениями в Unity, но в основном кнопка отправит «сообщение» «сообщение».(т.е. он будет вызывать функцию name message в любом скрипте, прикрепленном к messagee).Установите «messagee» для GameObject с помощью функции «Shoot».И установите в сообщении строку «Стреляй».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...