An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
3.1 KiB

using UnityEngine;
using System.Collections;
namespace Fungus
{
/**
* Draws a GUI button at a consistent size regardless of screen resolution.
* The button can be positioned anywhere on the screen using normalized screen coords.
* Vertical and horizontal padding can be applied to offset the button away from the screen edge.
* Several options are available for handling the player click action.
*/
public class GUIButton : MonoBehaviour
{
/// Button texture to draw on the screen.
[Tooltip("Button texture to draw on the screen.")]
public Texture2D texture;
/// Button size as a fraction of screen height [0..1].
[Range(0, 1)]
[Tooltip("Button size as a fraction of screen height [0..1].")]
public float verticalScale = 0.2f;
/// Texture position on screen in localized screen coords [0..1]
[Tooltip("Texture position on screen in localized screen coords [0..1]")]
public Vector2 screenPosition;
/// Space between edge of screen and texture (in pixels).
[Tooltip("Space between edge of screen and texture (in pixels).")]
public Vector2 padding;
/// Supported actions to perform when player clicks the button.
public enum ClickAction
{
/// Perform no action, useful when you just want to display a sprite in screen space.
None,
/// Open the URL specified in actionParameter in the browser
OpenURL,
/// Call a method specified by actionParameter on all Room objects in the scene.
SendMessage
};
/// Action to perform when player clicks the button.
[Tooltip("Action to perform when player clicks the button.")]
public ClickAction clickAction;
/// Parameter associated with the click action.
[Tooltip("Parameter associated with the click action.")]
public string actionParameter;
void OnGUI()
{
if (texture == null)
{
return;
}
// Calc initial center point
float x = screenPosition.x * Screen.width;
float y = screenPosition.y * Screen.height;
// Height is calculated as a fraction of screen height for resolution independent sizing.
// Width is then calculated so as to maintain the original aspect ratio of the texture.
float height = Screen.height * verticalScale;
float width = texture.width * (height / texture.height);
// Calc initial rect for rendering texture
float x1 = x - width / 2f;
float y1 = y - height / 2f;
float x2 = x + width / 2f;
float y2 = y + height / 2f;
// Adjust rect to fit on screen, and apply vertical & horizontal padding
if (x1 < padding.x)
{
x1 = padding.x;
x2 = x1 + width;
}
if (x2 > Screen.width - padding.x)
{
x2 = Screen.width - padding.x;
x1 = x2 - width;
}
if (y1 < padding.y)
{
y1 = padding.y;
y2 = y1 + height;
}
if (y2 > Screen.height - padding.y)
{
y2 = Screen.height - padding.y;
y1 = y2 - height;
}
// Draw the texture
Rect textureRect = new Rect(x1, y1, x2 - x1, y2 - y1);
if (GUI.Button(textureRect, texture, new GUIStyle()))
{
switch (clickAction)
{
case ClickAction.OpenURL:
Application.OpenURL(actionParameter);
break;
case ClickAction.SendMessage:
// TODO: Execute a sequence
break;
}
}
}
}
}