c# - 为什么角色旋转太快?
问题描述
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AnimatorController : MonoBehaviour
{
public Animator[] animators;
public Transform target;
public float speed = 1f;
public float rotationSpeed;
public bool slowDown = false;
public PlayAnimations playanimation;
private bool endRot = false;
private bool endRotation = false;
private Vector3 center;
private bool StartWaitingAnim = true;
// Use this for initialization
void Start()
{
center = target.GetComponent<Renderer>().bounds.center;
for (int i = 0; i < animators.Length; i++)
{
animators[i].SetFloat("Walking Speed", speed);
}
}
// Update is called once per frame
void Update()
{
float distanceFromTarget = Vector3.Distance(animators[2].transform.position, target.position);
for (int i = 0; i < animators.Length; i++)
{
animators[2].transform.position = Vector3.MoveTowards(animators[2].transform.position, center, 0);
}
if (slowDown)
{
if (distanceFromTarget < 10)
{
float speed = (distanceFromTarget / 10) / 1;
for (int i = 0; i < animators.Length; i++)
{
animators[i].SetFloat("Walking Speed", speed);
}
}
}
if (distanceFromTarget < 5f)
{
for (int i = 0; i < animators.Length; i++)
{
animators[i].SetBool("Idle", true);
if (StartWaitingAnim == true)
{
StartCoroutine(WaitForAnimation());
StartWaitingAnim = false;
}
RotateCharacters(2);
}
if (!endRot)
{
Quaternion goalRotation = Quaternion.Euler(0f, 180f, 0f);
float angleToGoal = Quaternion.Angle(
goalRotation,
animators[0].transform.localRotation);
float angleThisFrame = Mathf.Min(angleToGoal, rotationSpeed * Time.deltaTime);
// use axis of Vector3.down to keep angles positive for ease of use
animators[0].transform.Rotate(Vector3.up, angleThisFrame);
animators[1].transform.Rotate(Vector3.down, angleThisFrame);
// We end if we rotated the remaining amount.
endRot = (angleThisFrame == angleToGoal);
}
{
animators[0].SetBool("Rifle Aiming Idle", true);
animators[1].SetBool("Rifle Aiming Idle", true);
}
}
}
private void RotateCharacters(int CharacterIndexToRotate)
{
if (!endRotation && waitangimation == true)
{
Quaternion goalRotation = Quaternion.Euler(0f, -90f, 0f);
float angleToGoal = Quaternion.Angle(
goalRotation,
animators[CharacterIndexToRotate].transform.localRotation);
float angleThisFrame = Mathf.Min(angleToGoal, 100 * Time.deltaTime);
animators[CharacterIndexToRotate].transform.Rotate(Vector3.down, angleThisFrame);
endRotation = (angleThisFrame == angleToGoal);
}
else
{
animators[2].SetBool("Magic Pack", true);
}
}
bool waitangimation = false;
IEnumerator WaitForAnimation()
{
yield return new WaitForSeconds(3);
waitangimation = true;
}
}
当使用在 Update 中旋转前两个动画器时检查:
if (!endRot)
然后动画师 0 和 1 都在缓慢平滑地旋转。
但后来我想制作一个旋转方法并将其命名为 RotateCharacters 这个方法我正在尝试旋转动画师[2],但他的旋转速度太快了。RotateCharacters 中的代码与旋转其他动画师相同。但是动画师[2] 的旋转速度仍然非常快。
最后,我只想使用 RotateCharacters 方法来旋转动画师。
解决方案
您RotateCharacters
使用2
as 参数而不是循环变量调用i
。
所以你animators[2]
在每个循环迭代中旋转。
推荐阅读
- html - 使博客文章移动友好
- java - 跟踪 Actor 流的内存使用情况
- arrays - Ruby Array:TypeError(没有将 Symbol 隐式转换为 Integer)
- json - 如何在 ActiveMQ 上发布 JSON 对象
- batch-file - 在 tfs build 中获取构建代理文件夹路径
- typescript - TS 错误:类型“T[]”不可分配给类型“[T]”。类型“T[]”中缺少属性“0”
- python - 在 python 2.7 中使用另一个类的装饰
- c# - 运行时 Xamarin 中的网格布局更改
- node.js - 在 node.js 和 postgres 中为循环中的每个项目添加响应
- r - 对多个绘图使用多个选项