在携程中对按钮进行Z方向上的位移,但是在yield return waitforseconds之后所做的位移被还原了,也就是说在每一次yield return waitforseconds之后按钮的位置自动还原到按钮的初始位置
上图
第一张图片是进行到yield return之前的位置
第二张图片是yield return 进行完毕后的位置
waitforseconds等待时间内进行的fixedupdate操作并未改变按钮的位置
请帮帮忙
在携程中对按钮进行Z方向上的位移,但是在yield return waitforseconds之后所做的位移被还原了,也就是说在每一次yield return waitforseconds之后按钮的位置自动还原到按钮的初始位置
上图
第一张图片是进行到yield return之前的位置
第二张图片是yield return 进行完毕后的位置
waitforseconds等待时间内进行的fixedupdate操作并未改变按钮的位置
请帮帮忙
我的源码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class Shake : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
public GameObject target;//需要挂载的目标
float shakeTime = 1.0f;//抖动总时间
float shakeDeratime = 0.01f;//每次抖的间隔时间
float shakeRate = 0.1f;//抖动幅度
bool isDowning = false;//是否点击
bool isIEworking = false;//携程是否正在工作
float startTime;
float maxTime = 1.0f;
int direction = 1;
Coroutine c = null;
float nowZ;
// Start is called before the first frame update
void Start()
{
target = this.gameObject;
}
public IEnumerator IEShake()
{
float rate = shakeRate;
nowZ = target.transform.position.z;
for (float i = 0; i < shakeTime; i += shakeDeratime)
{
if (!isDowning)
{
break;
}
target = this.gameObject;
target.transform.position = new Vector3(target.transform.position.x, target.transform.position.y, 0) + rate * Vector3.forward * 20;
if (System.Math.Abs(rate) < 1)
{
rate = rate + shakeRate * direction;
}
else
{
direction = -direction;
rate = rate + shakeRate * direction;
}
//到yield会自动清零z坐标
yield return new WaitForSeconds(shakeDeratime);
}
target.transform.position = new Vector3(target.transform.position.x, target.transform.position.y, nowZ);
isIEworking = false;
}
private void FixedUpdate()
{
target = this.gameObject;
if (isDowning)
{
if (Time.time - startTime >= maxTime && !isIEworking)
{
isIEworking = true;
c = StartCoroutine(IEShake());
}
}
if (!isDowning && c != null)
{
StopCoroutine(c);
target.transform.position = new Vector3(target.transform.position.x, target.transform.position.y, nowZ);
isIEworking = false;
}
}
public void OnPointerDown(PointerEventData eventData)
{
isDowning = true;
startTime = Time.time;
}
public void OnPointerUp(PointerEventData eventData)
{
isDowning = false;
startTime = Time.time;
}
}