иногда ему удается синхронизировать более одного раза, и если вы можете найти правильное место, вы можете просто сохранить его там, и он будет продолжать добавлять счет до.
хорошо в
if (Test > 359 && Test < 360)
{
Debug.Log("Clocked");
count();
}
что произойдет, если ваш угол, например, 359.5
Очень трудно просто взять текущее вращение и узнать, было ли оно повернуто больше или меньше определенного угла.
Я бы предпочел сохранить последний поворот, сравнить его с текущим и добавить разницу в переменную. Затем, если переменная превышает 360
, выполняется полное вращение. Поскольку я также не люблю что-либо вычислять с помощью Quaternion
и eulerAngles
, проще использовать методы, предоставленные Vector3
.
Для локального поворота вокруг X
(== transform.right
) я бы использовал угол между текущим и последним transfrm.up
вектором.
что-то вроде
public class RotationCheck : MonoBehaviour
{
public int RotationCount;
public float rotatedAroundX;
public Vector3 lastUp;
public UnityEvent On3TimesRotated;
private void Awake()
{
rotatedAroundX = 0;
// initialize
lastUp = transform.up;
}
private void Update()
{
var rotationDifference = Vector3.SignedAngle(transform.up, lastUp, transform.right);
rotatedAroundX += rotationDifference;
if (rotatedAroundX >= 360.0f)
{
Debug.Log("One positive rotation done", this);
RotationCount++;
rotatedAroundX -= 360.0f;
}
else if (rotatedAroundX <= -360.0f)
{
Debug.Log("One negative rotation done", this);
RotationCount--;
rotatedAroundX += 360.0f;
}
// update last rotation
lastUp = transform.up;
// check for fire the event
if (RotationCount >= 3)
{
On3TimesRotated?.Invoke();
RotationCount = 0;
}
}
}
Вы можете использовать UnityEvent , чтобы получить то же самое, что Button
использует для onClick
, так что вы можете ссылаться на обратные вызовы там через инспектора.

НО если вас не волнуют одиночные повороты, а фактически только финальный RotationCount >= 3
Я бы на самом деле использовал
private void Update()
{
var rotationDifference = Vector3.SignedAngle(transform.up, lastUp, transform.right);
rotatedAroundX += rotationDifference;
RotationCount = Mathf.RoundToInt(rotatedAroundX / 360.0f);
// update last rotation
lastUp = transform.up;
// check for fire the event
if (RotationCount >= 3)
{
On3TimesRotated?.Invoke();
RotationCount = 0;
rotatedAroundX = 0;
}
}
, который непосредственно уменьшает значение на единицу при повороте под отметкой 360 вместо ожидания полного отрицательного вращения

*, как вы можете видеть, вместо достижения 3, RotationCount
сбрасывается в 0. Это то место, где событие On3TimesRotated
запускается / запускается.