Есть возможность сделать ограничение по скорости.Допустим,вы хотите,чтобы игрок не бежал в стену или вдоль стены,не проигрывал анимацию при скорости меньше 0.01 или т.д.
Тогда нужно каждое второе обновление update высчитывать позицию игрока(именно второе, иначе будут получаться слишком маленькие значения):
//Добавляем минимальное изменение позиции(Minimal Change):
Vector3 MinC;
//Добавляем счётчик обновлений:
float UpCount = 0;
//Добавляем bool двигается/нет:
bool IsMoving;
void Start()
{
//Считываем позицию в начале игры(Old Position):
Vector3 OldP = transform.position;
//Настраиваем минимальное изменение позиции:
MinC = new Vector3(0.01f,0.01f,0.01f);
}
void Update()
{
if(UpCount<1)
{
UpCount += 1;
}
else
{
//Обнуляем счётчик а затем проверяем изменение позиции
UpCount = 0;
if(transform.position.x-OldP.x > MinC.x || transform.position.y-OldP.y > MinC.y || transform.position.z-OldP.z > MinC.z)
{
//Подтверждаем, что двигается:
IsMoving=true;
}
else
{
//Подтверждаем, что двигается:
IsMoving = false;
}
//Обновляем старую позицию игрока:
OldP = transform.position;
}
}
Гений,плейбой,миллиардер - StrannikY
Но как определить с помощью кода движется ли объект или нет, не знаю.
Нужно знать конкретно, что объект движется, как это записать? Уже не первый день бьюсь над этим вопросом. Помогите пожалуйста!
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(Rigidbody))]
public class PlayerMoveController : MonoBehaviour {
// PUBLIC
public SimpleTouchController leftController;
public SimpleTouchController rightController;
public Transform headTrans;
public float speedMovements = 5f;
public float speedContinuousLook = 100f;
public float speedProgressiveLook = 3000f;
// PRIVATE
private Rigidbody _rigidbody;
[SerializeField] bool continuousRightController = true;
void Awake()
{
_rigidbody = GetComponent();
rightController.TouchEvent += RightController_TouchEvent;
}
public bool ContinuousRightController
{
set{continuousRightController = value;}
}
void RightController_TouchEvent (Vector2 value)
{
if(!continuousRightController)
{
UpdateAim(value);
}
}
void Update()
{
// move
_rigidbody.MovePosition(transform.position + (transform.forward * leftController.GetTouchPosition.y * Time.deltaTime * speedMovements) +
(transform.right * leftController.GetTouchPosition.x * Time.deltaTime * speedMovements) );
if(continuousRightController)
{
UpdateAim(rightController.GetTouchPosition);
}
}
void UpdateAim(Vector2 value)
{
if(headTrans != null)
{
Quaternion rot = Quaternion.Euler(0f,
transform.localEulerAngles.y - value.x * Time.deltaTime * -speedProgressiveLook,
0f);
_rigidbody.MoveRotation(rot);
rot = Quaternion.Euler(headTrans.localEulerAngles.x - value.y * Time.deltaTime * speedProgressiveLook,
0f,
0f);
headTrans.localRotation = rot;
}
else
{
Quaternion rot = Quaternion.Euler(transform.localEulerAngles.x - value.y * Time.deltaTime * speedProgressiveLook,
transform.localEulerAngles.y + value.x * Time.deltaTime * speedProgressiveLook,
0f);
_rigidbody.MoveRotation(rot);
}
}
void OnDestroy()
{
rightController.TouchEvent -= RightController_TouchEvent;
}
}
Если быть точным то за движение отвечает данная часть скрипта
_rigidbody.MovePosition(transform.position + (transform.forward * leftController.GetTouchPosition.y * Time.deltaTime * speedMovements) +
(transform.right * leftController.GetTouchPosition.x * Time.deltaTime * speedMovements) );
А как вычислить движется ли объект я не могу.