Скрипт управления виртуальным объектом - Разработка системы дополненной реальности с поддержкой распознавания жестов в режиме реального времени

Using UnityEngine;

/// <summary>

/// Скрипт объявляющий VirtualButton interface и

/// определяет soccer ball логику.

/// </summary>

Public class VBSoccerballEventHandler: MonoBehaviour,

IVirtualButtonEventHandler

{

#region PRIVATE_MEMBER_VARIABLES

Private GameObject mSoccerball;

Private bool mIsRolling = false;

Private float mTimeRolling = 0.0f;

Private float mForce = 0.4f;

#endregion // PRIVATE_MEMBER_VARIABLES

#region PUBLIC_METHODS

/// <summary>

/// Вызывается в начальный момент нажатия VirtualButton:

/// </summary>

Public void OnButtonPressed(VirtualButtonBehaviour vb)

{

Debug. Log("OnButtonPressed");

KickSoccerball();

}

/// <summary>

/// Вызывается сразу после отпускания кнопки:

/// </summary>

Public void OnButtonReleased(VirtualButtonBehaviour vb)

{

Debug. Log("OnButtonReleased");

}

#endregion // PUBLIC_METHODS

#region UNTIY_MONOBEHAVIOUR_METHODS

Void Start()

{

// Получаем дескриптор объекта Soccerball

MSoccerball = transform. FindChild("soccerball").gameObject;

// Регестрируем с virtual buttons TrackableBehaviour

VirtualButtonBehaviour vb =

GetComponentInChildren<VirtualButtonBehaviour>();

If (vb)

{

Vb. RegisterEventHandler(this);

}

// Подгонка размеров под метку

MForce *= transform. localScale. x;

}

Void Update()

{

MTimeRolling += Time. deltaTime;

// Замендление шара

If (mIsRolling &;&; mTimeRolling > 1.0f &;&;

MSoccerball. rigidbody. velocity. magnitude < 5)

{

MSoccerball. rigidbody. Sleep();

MIsRolling = false;

}

}

#endregion // UNTIY_MONOBEHAVIOUR_METHODS

#region PRIVATE_METHODS

/// <summary>

/// Толчок мяча в случайном направлении

/// </summary>

Private void KickSoccerball()

{

// Получаем границы метки

Bounds targetBounds = this. collider. bounds;

Rect targetRect = new Rect( - targetBounds. extents. x,

-targetBounds. extents. z,

TargetBounds. size. x,

TargetBounds. size. z);

// Определяем направление толчка с учетом того, что он должен остаться на метке

Vector2 randomDir = new Vector2();

For (int i = 0; i < 20; i++)

{

RandomDir = Random. insideUnitCircle. normalized;

// возвращает позицию мяча

Vector3 pos = mSoccerball. transform. localPosition *

This. transform. localScale. x;

// Оценка конечного положения

Vector2 finalPos = new Vector2(pos. x, pos. z) +

RandomDir * mForce * 1.5f;

If (targetRect. Contains(finalPos))

{

Break;

}

// Направление движения

Vector3 kickDir = new Vector3(randomDir. x, 0, randomDir. y).normalized;

// Вращение мяча в правильном направлении

Vector3 torqueDir = Vector3.Cross(Vector3.up, kickDir).normalized;

MSoccerball. rigidbody. AddForce(kickDir * mForce,

ForceMode. VelocityChange);

MSoccerball. rigidbody. AddTorque(torqueDir * mForce,

ForceMode. VelocityChange);

MIsRolling = true;

MTimeRolling = 0.0f;

}

#endregion // PRIVATE_METHODS

}

Похожие статьи




Скрипт управления виртуальным объектом - Разработка системы дополненной реальности с поддержкой распознавания жестов в режиме реального времени

Предыдущая | Следующая