Browse Source

Renamed AnchorGUITexture to GUIButton

- Retained the existing screen positioning logic
- Add support for button actions
    1. Open a URL on click (e.g. for a watermark sprite)
    2. Call a named method on all Room objects
- Moved example implementation to Button Room
master
chrisgregan 11 years ago
parent
commit
23af2fc443
  1. 71
      Assets/Fungus/Scripts/AnchorGUITexture.cs
  2. 108
      Assets/Fungus/Scripts/GUIButton.cs
  3. 0
      Assets/Fungus/Scripts/GUIButton.cs.meta
  4. BIN
      Assets/FungusExample/Scenes/Example.unity
  5. 11
      Assets/FungusExample/Scripts/ButtonRoom.cs
  6. 13
      Assets/FungusExample/Scripts/SpriteRoom.cs

71
Assets/Fungus/Scripts/AnchorGUITexture.cs

@ -1,71 +0,0 @@
using UnityEngine;
using System.Collections;
/**
* Draws a GUI texture at a consistent size regardless of screen resolution.
* The texture can be positioned anywhere on the screen using normalized screen coords.
* Vertical and horizontal padding can be applied to offset the texture away from the screen edge.
*/
public class AnchorGUITexture : MonoBehaviour
{
/// Texture to draw on the screen.
public Texture2D texture;
/// Fraction of screen height (for resolution independent sizing).
public float verticalScale = 0.2f;
/// Texture position on screen in localized screen coords ([0..1], [0..1])
public Vector2 screenPosition;
/// Vertical and horizontal space between edge of screen and texture (in pixels).
public Vector2 padding;
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);
GUI.DrawTexture(textureRect, texture);
}
}

108
Assets/Fungus/Scripts/GUIButton.cs

@ -0,0 +1,108 @@
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
{
/// Texture to draw on the screen.
public Texture2D texture;
/// Fraction of screen height (for resolution independent sizing).
public float verticalScale = 0.2f;
/// Texture position on screen in localized screen coords ([0..1], [0..1])
public Vector2 screenPosition;
/// Vertical and horizontal 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.
public ClickAction clickAction;
/// 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))
{
switch (clickAction)
{
case ClickAction.OpenURL:
Application.OpenURL(actionParameter);
break;
case ClickAction.SendMessage:
// Send the message to all Room objects in the scene
Room[] allRooms = GameObject.FindObjectsOfType<Room>();
foreach (Room room in allRooms)
{
room.SendMessage(actionParameter, SendMessageOptions.DontRequireReceiver);
}
break;
}
}
}
}
}

0
Assets/Fungus/Scripts/AnchorGUITexture.cs.meta → Assets/Fungus/Scripts/GUIButton.cs.meta

BIN
Assets/FungusExample/Scenes/Example.unity

Binary file not shown.

11
Assets/FungusExample/Scripts/ButtonRoom.cs

@ -5,7 +5,7 @@ namespace Fungus.Example
{
public class ButtonRoom : Room
{
public Fungus.Room menuRoom;
public Room menuRoom;
public AudioClip effectClip;
@ -13,8 +13,15 @@ namespace Fungus.Example
public Button soundButton;
public Button questionButton;
// GUIButton displays a button texture at the same size & position regardless of screen resolution.
// This is handy for displaying simple buttons in a consistent manner across devices.
public GUIButton mushroomButton;
void OnEnter()
{
// Show the mushroom logo immediately
mushroomButton.enabled = true;
// Show button, always visible (because autoHide is set to false)
ShowButton(homeButton, OnHomeClicked);
@ -34,6 +41,8 @@ namespace Fungus.Example
void OnHomeClicked()
{
mushroomButton.enabled = false;
MoveToRoom(menuRoom);
}

13
Assets/FungusExample/Scripts/SpriteRoom.cs

@ -11,15 +11,8 @@ namespace Fungus.Example
public SpriteRenderer blueAlienSprite;
public SpriteRenderer redMushroomSprite;
// AnchorGUITexture displays a texture at the same size & position regardless of screen resolution.
// This is handy for displaying simple GUI textures in a consistent manner across devices.
public AnchorGUITexture mushroomLogo;
void OnEnter()
{
// Show the mushroom logo immediately
mushroomLogo.enabled = true;
HideSprite(redMushroomSprite);
ShowSprite(blueAlienSprite);
@ -64,12 +57,6 @@ namespace Fungus.Example
Say("Heh. That Blue Alien - what a guy!");
// We want the mushroom logo to hide just before we move to the menuRoom,
// so we pass a delegate method to the Call command which will execute as part of the command sequence.
Call(delegate {
mushroomLogo.enabled = false;
});
MoveToRoom(menuRoom);
}
}

Loading…
Cancel
Save