必做 + 选做1 + 选做2
提交代码包含空行共 27 行:
void Start()
{
Vector3[] target = new Vector3[4];
for (int i = 0; i < target.Length; ++i)
{
Vector3 dir = Quaternion.AngleAxis(Random.Range(0, 180), Vector3.up) * transform.right; //方向
float distance = Random.Range(0, 10f); //距离
target[i] = transform.position + dir * distance; //整个for循环其实可以压成一行,为了可读性分多行写
}
StartCoroutine(MoveCoroutine());
IEnumerator MoveCoroutine()
{
for (int i = 0; /*结束条件*/; i = (i + 1) % target.Length)
{
Quaternion targetRotation = Quaternion.LookRotation(target[i] - transform.position);
while (Vector3.Distance(transform.position, target[i]) > 0.01f)
{
transform.position = Vector3.Lerp(transform.position, target[i], 4f * Time.deltaTime / Vector3.Distance(transform.position, target[i]));
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, 4f * Time.deltaTime);
yield return null;
}
}
}
}
编辑:临时去学了点异步,写得不太行。。
选做3:
Vector3[] target = new Vector3[4];
Vector3 pos;
Vector3 newPos;
void Start()
{
transform.position = Vector3.zero;
for (int i = 0; i < target.Length; ++i)
{
Vector3 dir = Quaternion.AngleAxis(Random.Range(0, 180), Vector3.up) * transform.right;
float distance = Random.Range(0, 10f);
target[i] = (transform.position + dir * distance);
}
MoveAsync(transform);
}
CancellationTokenSource c = new CancellationTokenSource();
async void MoveAsync(Transform transform)
{
for (int i = 0; !c.IsCancellationRequested; i = (i + 1) % target.Length)
{
while (Vector3.Distance(transform.position, target[i]) > 0.01f)
{
pos = transform.position;
await Task.Run(() => {
newPos = Vector3.Lerp(pos, target[i], 0.1f / Vector3.Distance(pos, target[i]));
});
transform.position = newPos;
}
}
}
private void OnDestroy()
{
c.Cancel();
}
极限压缩:
必做 4 行
void Start()
{
Vector3[] target = new Vector3[4];
for (int i = 0; i < target.Length; ++i) target[i] = transform.position + (Quaternion.AngleAxis(Random.Range(0, 180), Vector3.up) * transform.right) * Random.Range(0, 10f);
StartCoroutine(MoveCoroutine());
IEnumerator MoveCoroutine() { for (int i = 0; ; i = (i + 1) % target.Length) while (Vector3.Distance(transform.position = Vector3.Lerp(transform.position, target[i], 4f * Time.deltaTime / Vector3.Distance(transform.position, target[i])), target[i]) > 0.01f) yield return null; }
}