Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как узнать движется ли объект! Unity 3D

Velbron Профи (914), закрыт 4 года назад
Есть скрипт движения игрока с помощью джойстика.
Но как определить с помощью кода движется ли объект или нет, не знаю.
Нужно знать конкретно, что объект движется, как это записать? Уже не первый день бьюсь над этим вопросом. Помогите пожалуйста!

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) );

А как вычислить движется ли объект я не могу.
Лучший ответ
Рыжий Кот Мастер (1786) 4 года назад
Непонятно. Тебе нужно узнать, движется объект или нет? Посмотри в инспекторе, если он движется, значит меняет свою позицию.
VelbronПрофи (914) 4 года назад
мне нужно написать код по которому будет выяснятся стоит ли объект или движется
Остальные ответы
Роман Сёмин Профи (525) 4 года назад
void Start()
{
Vector3 OldPosition = transform.position;
}
void Update()
{
if(OldPosition != transform.position)
Debug.Log("объект движется");
OldPosition = transform.position;
}
//Работает безотказно
Alexander SergeevichЗнаток (274) 1 год назад
Я понимаю, что прошло уже 2 года. Но блин, у меня юнити жалуется на фразу "Vector3 OldPosition = transform.positon;" в старте. Почему?...
Alexander Sergeevich Знаток (274) Alexander Sergeevich, нашел решение, надо было просто создать эту переменную(private Vector3 OldPosition"XXDD
StrannikY Ученик (114) 1 месяц назад
Есть возможность сделать ограничение по скорости.Допустим,вы хотите,чтобы игрок не бежал в стену или вдоль стены,не проигрывал анимацию при скорости меньше 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
Похожие вопросы