今天做了一个退出按钮的tweener动画,想的效果是,鼠标移上去,按钮移入,鼠标移除,按钮移除,点击退出按钮,退出程序。
1:效果图
2 :Tweener的记录
//关闭按钮
[SerializeField] RectTransform closeButton;
//初始结束位置
Vector2 startPos;
Vector2 endPos;
//tweener动画
Tweener closeButtonShow;
Tweener closeButtonDisShow;
void Start()
{
startPos = closeButton.anchoredPosition;
endPos = closeButton.anchoredPosition - new Vector2(0, 150);
//移入动画记录
closeButtonShow = closeButton.DOAnchorPosY(endPos.y, 1);
closeButtonShow.SetAutoKill(false);
closeButtonShow.Pause();
//移除动画记录
closeButtonDisShow = closeButton.DOAnchorPosY(startPos.y, 1);
closeButtonDisShow.SetAutoKill(false);
closeButtonDisShow.Pause();
}
注意事项:(记录一下我出问题的地方)
1 UI图片运用dotween移动时,不能用DoMove,要用DOAnchorPos,DoMove是针对Tranform的,而后一个是针对2D物体的。
2 要想动画一直播放,记得把动画的SetAutoKill()设为false,这个属性是是否杀死动画,就是播放完一次,图片就不再播放了,如果需要一直播放,记得把他置为false。
3 记住Tweener动画记录的这三条语句
3 鼠标移入和移除
这里需要用到鼠标的两个接口,IPointerEnterHandler, IPointerExitHandler,
public class Close : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
}
在MonoBehaviour后面加个逗号,写上两个接口,再实现接口就好了
然后再接口方法中,播放dotween动画
//鼠标进入
public void OnPointerEnter(PointerEventData eventData)
{
closeButtonShow.Restart();
}
//鼠标移除
public void OnPointerExit(PointerEventData eventData)
{
closeButtonDisShow.Restart();
}
注意事项:播放动画时,用ReStart(),因为这里需要每次鼠标移入移除,都播放动画,所以每次都让他重新播放,而Play()只能播放一次,不能实现需求。
dotween的二次学习:
实现功能,点击鼠标,图片向右移动出现,再点击一次,图片回到原来位置隐藏,连续点击的时候,不会出现左右摇摆的状态,等播放完上一个动画之后,再播放下一个动画。
效果图:
RectTransform QRImage;
bool isShow; //是否出现的bool值,出现为true,隐藏为false
//tweenwe动画
Tweener QRTweenerShow; //出现动画
Tweener QRTweenerDisPlay; //消失动画
private void Start()
{
QRImage = gameObject.transform.GetComponent<RectTransform>();
//初始,结束位置赋值
float startX = QRImage.anchoredPosition.x;
float endX = QRImage.anchoredPosition.x + 55;
//一开始是隐藏状态
isShow = false;
//二维码出现,消失的动画记录,按钮的委托事件
QRTweenerShow = QRImage.DOAnchorPosX(endX, 0.5f);
QRTweenerShow.SetAutoKill(false);
QRTweenerShow.Pause();
QRTweenerShow.OnComplete(delegate { isEnd = false; });
QRTweenerDisPlay = QRImage.DOAnchorPosX(startX, 0.5f);
QRTweenerDisPlay.SetAutoKill(false);
QRTweenerDisPlay.Pause();
QRTweenerDisPlay.OnComplete(delegate { isEnd = false; });
//按钮监听
QRImage.GetComponent<Button>().onClick.AddListener(QRImageShowAndHide);
}
bool isEnd; //false 结束
public void QRImageShowAndHide()
{
//当不是结束状态时,播放动画
if (!isEnd)
{
//当isShow=true时,执行消失的动画,当=false时,执行出现的动画
Tweener tweener = isShow ? QRTweenerDisPlay : QRTweenerShow;
tweener.Restart();
tweener.Play();
isShow = !isShow;
isEnd = true;
}
}
重点记录:当需要鼠标点一次执行一个方法,再点一次再执行一个方法的时候,用bool值添加一个判断
在QRImageShowAndHide()这个方法中也可以用if和else,但是上面的方法更加简洁
if (isShow)
{
QRTweenerDisPlay.Restart();
QRTweenerDisPlay.Play();
isShow = false;
}
else
{
QRTweenerShow.Restart();
QRTweenerShow.Play();
isShow = true;
}
不可以用两个if,如果是两个if的话,他俩是并列的,就在方法体内形成了循环了,图片是不移动的