一般来说,开始游泳的时候,速度从0开始增加,越来越快,达到最大速度的时候停止。停止动作的时候,会由于惯性滑出一段距离,在此过程中速度从最大速度逐渐减为0,变成静止。
所以这里面涉及两个简单的协程调用。代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class Move : MonoBehaviour
{
// Start is called before the first frame update
public float speed;
public float speed2;
public Animator a;
public bool Iscanrotate;
void Start()
{
speed = 0f;
speed2 = 0.01f;
Iscanrotate = true;
}
IEnumerator move1(float time)//加速运动至某一速度匀速运动
{
int num = (int)(time / 0.02f);//一共100次
for (int i = 0; i < num; i++)
{
speed += time / num;//0+0.02 速度是匀速增加的
if (speed >= 5)//当速度大于等于1时
{
speed = 5;//速度恒定
}
yield return new WaitForSeconds(0.02f);
}
yield return new WaitForSeconds(0.02f);
}
IEnumerator move2(float time)//减速运动至静止
{
int num = (int)(time / 0.02f);
for (int i = 0; i < num; i++)
{
speed -= time / num;
if (speed<=0)
{
speed = 0;
}
yield return new WaitForSeconds(0.02f);
}
yield return new WaitForSeconds(0.02f);
}
// Update is called once per frame
void Update()
{
Rigidbody r = GetComponent<Rigidbody>();
if (Input.GetKey(KeyCode.W))
{
a.SetBool("isSwim", true);
transform.Translate(Vector3.forward * speed * 0.002f);
StartCoroutine(move1(3));
}
else
{
a.SetBool("isSwim", false);
transform.Translate(Vector3.forward * speed * 0.001f);
StartCoroutine(move2(1));
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(Vector3.down * speed2);
}
else
{
if (transform.position.y <= 48.7f)
{
//speed2 = 0;
transform.Translate(Vector3.up * speed2 * 0.3f);
}
}
if (Input.GetKey(KeyCode.A))
{
transform.Rotate(new Vector3(0, -0.1f, 0));
}
if (Input.GetKey(KeyCode.D))
{
transform.Rotate(new Vector3(0, 0.1f, 0));
}
}
}