《领导关怀版本 需求3》
一:图片本地加载,打字效果,循环播放
二:通过触摸屏幕/鼠标 滑动
三:跟随手指,滑动效果
版本系列(一):实现了读取本地图片,循环播放功能
版本系列(二):原来的基础上,实现了触摸屏手指滑动,无操作一段时间自动循环播放
版本系列(三):前两版基础上,实现了触摸屏图片跟随手指滑动,滑动力度,实现缓动惯性效果
奈何客户需求无止尽,不断产品功能,增强体验。
码农感悟大部分程序都是这样,
实现了代码优化,先实现功能需求,再考虑代码性能优化。
/// <summary>
/// 手指跟随图片 一开始位置用的是Lerp,现在直接等于增量的位置 1:1
/// </summary>
public float DataSpeed = 0.09f;
/// <summary>
/// 记录增量
/// </summary>
public List<Vector2> PointerEventData;
因为在项目工程测试是鼠标点击操作的,所以只需要鼠标增量列为速度,逐渐移动图片位移即可,但实际操作触摸屏,手指松开,会有增量为0的情况,解决办法,取范围内增量的平均值。
/// <summary>
/// 鼠标拖动物体移动
/// </summary>
/// <param name="data"></param>
public void fn_MoveObj(BaseEventData data)
{
var v = (data as PointerEventData).delta.x * DataSpeed;
PointerEventData.Add((data as PointerEventData).delta);//触摸屏
actions?.Invoke(v);
}
Coroutine coroutines;
public void End_MoveObj()
{
float DeltaSpeed = 0;
int count = 0;
for (int i = Mathf.Max(0, PointerEventData.Count - 5); i < PointerEventData.Count; i++)
{
if (Mathf.Abs(PointerEventData[i].x) <= 0.2f)
{
continue;
}
DeltaSpeed += PointerEventData[i].x;
count++;
}
Debug.Log(Mathf.Min(5, PointerEventData.Count));
DeltaSpeed = DeltaSpeed / count; /*Mathf.Min(5, DrugUI.instance.PointerEventData.Count);*/
test.text = (DeltaSpeed).ToString();
coroutines = StartCoroutine(fn_SpeedMove(DeltaSpeed));
//EndActions?.Invoke(DeltaSpeed);
PointerEventData.Clear();//清空
}
/// <summary>
/// 加缓动惯性协程
/// </summary>
/// <param name="speed"></param>
/// <returns></returns>
IEnumerator fn_SpeedMove(float DeltaSpeed)
{
while (Mathf.Abs(DeltaSpeed) > 0.2f)
{
DeltaSpeed = Mathf.Lerp(DeltaSpeed, 0, 0.05f);
actions?.Invoke(DeltaSpeed);
yield return null;
}
}
public void StopCoroutine()
{
if (coroutines != null)
StopCoroutine(coroutines);
}
效果图: