前言
在很多的游戏当中都有这样的效果:当按钮被按下时缩小,松开时放大。今天带来一个通用的脚本,只需要挂载到需要实现效果的按钮上就可以啦
源码
(觉得代码墨迹的下边有懒b简洁版)
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
[RequireComponent(typeof(Button))]
public class ButtonScaler : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler
{
//原始缩放
private Vector3 originalScale;
//点击缩放
private Vector3 pressedScale;
private Button button;
[SerializeField] Transform tf;
private void Awake()
{
//获取原始缩放 避免有些按钮一开始的缩放不是1
originalScale = transform.localScale;
//按下缩放为原始缩放的0.9倍
pressedScale = originalScale * 0.9f;
//默认获取自身的变换组件
if (tf == null) tf = transform;
//获取按钮组件
button = GetComponent<Button>();
}
//按钮抬起
public void OnPointerUp(PointerEventData eventData)
{
if (button.interactable) tf.localScale = originalScale;
}
//按钮按下
public void OnPointerDown(PointerEventData eventData)
{
if (button.interactable) tf.localScale = pressedScale;
}
public void OnPointerClick(PointerEventData eventData)
{
}
private void OnDisable()
{
Destroy(this);
}
}
代码解释
有些代码也是可以优化的,我简单讲解一下:
1.首先开头添加了[RequireComponent(typeof(Button))]
特性,确保脚本只能添加到有 Button 组件的对象上。
2.使用缓存的originalScale和pressedScale 变量来存储缩放值,避免了每次点击的计算。
3.设置了一个带有[SerializeField]序列化的变换组件,这就是我们要缩放的物体,如果这个为空,那么默认就是按钮本身。我们也可以设置想要进行缩放的物体,增加可定制性,应对多种情况。
4.定义了一个Button 对象,并且在Awake中获取Button组件,这也对应了开头添加的[RequireComponent(typeof(Button))]特性, 这一步是为了让按钮只有在interactable可交互的时候才会触发缩放效果,有些时候我们在游戏中可能将按钮设置了不可点击interactable = false 那么也没有缩放的必要啦
代码清理
当然有些人觉得代码比较多,当你确定你的游戏中满足了以下要求你可以去掉对应的代码:
1.按钮只缩放自己本身 可以去掉 tf 变量的声明
2.按钮在游戏中不会设置不可点击,或者没有使用过interactable属性 可以去掉 button 的声明 以及[RequireComponent(typeof(Button))]特性 和UnityEngine.UI 的引用
3.你的游戏中所有的按钮初始缩放都是默认的1 那你也可以去掉开头变量的声明和Awake中的计算 ,直接使用写死的值
4. 如果你的游戏中,所有按钮的添加脚本都是在OnEnable方法中添加,而不是使用其他方式,那么一定一定不要去掉最下方的Destroy(this); 假设有这样的情况:你有一个设置界面,你在这个界面的脚本中的OnEnable()方法中写了这样的代码:btnClose.gameObject.AddComponent<ButtonScaler>();
意为在关闭按钮上添加缩放脚本。 假设这个关闭按钮的点击事件为禁用当前界面(而不是从场景中删除),那么当你下次打开设置界面时,你会发现你的关闭按钮上有两个ButtonScaler脚本。
简化版本
接下来给大家提供一个简洁版:
using UnityEngine;
using UnityEngine.EventSystems;
public class ButtonScaler : MonoBehaviour, IPointerDownHandler, IPointerUpHandler,
{
//按钮抬起
public void OnPointerUp(PointerEventData eventData)
{
transform.localScale = Vector3.one;
}
//按钮按下
public void OnPointerDown(PointerEventData eventData)
{
transform.localScale = Vector3.one * 0.8f;
}
}