Проверьте Снимок экрана сцены . Просто создайте пользовательский интерфейс с EventSystem. Создайте кнопку в вашем пользовательском интерфейсе. Присоедините EventTrigger к вашей кнопке. Теперь создайте два события на вашем EventTrigger:
(1) Указатель вниз (вызывается, когда кнопка нажата.)
(2) Указатель вверх (вызывается при отпускании кнопки.)
Прикрепите сценарий в конце этого ответа в качестве компонента к вашему игроку или кубу или тому, что вы хотите переместить.
Теперь вы можете видеть на скриншоте, что открытый метод MoveCube.MoveLeft get вызывается при каждом нажатии MoveLeftButton. Всякий раз, когда он выпущен, вызывается MoveCube.StopMovingLeft. Шутка о буле, который будет переключаться с ложного на истинный и обратно. Фактическое движение происходит в обновлении, которое по существу следует той же логике, что и предоставленный вами скрипт. Надеюсь, это поможет.
private bool moveLeft, moveRight;
void Start ()
{
// Get Rigidbody or CC or whatever you use to move your object.
}
void Update ()
{
if (moveLeft)
{
// Move Left
Debug.Log("Moving Left");
}
}
public void MoveLeft()
{
moveLeft = true;
}
public void StopMovingLeft()
{
moveLeft = false;
}
РЕДАКТИРОВАТЬ: Очень важно - я только что увидел, что вы используете transform.position + = Vector3 для перемещения объекта. У вас будут большие проблемы с точным столкновением, так как ваша функция буквально телепортирует ваш игровой объект на новую позицию. Чтобы избежать плохого столкновения, вы должны использовать Rigidbody.AddForce или, если вы хотите использовать transform, вы можете легко использовать transform.Translate:
Из документов Unity:
transform.Translate (Vector3.forward * Time.deltaTime);
РЕДАКТИРОВАТЬ 2: Вот код, который вы запросили в комментарии к этому ответу. Просто скопируйте скрипт, он должен работать нормально.
private bool moveLeft, moveRight;
// Create the rigidbody and the collider
private Rigidbody rb;
private Collider col;
// Create a variable you can change in inspector window for speed
[SerializeField]
private float speed;
void Start ()
{
// You can either use a CC (Character Controller) or a Rigidbody. Doesn't make that much of a difference.
// Important thing is, if you use a rigidbody, you will need a collider as well. Collider detect collision
// but rigidbodies do the actual work with regards to physics. In this case we use rigidbody/collider
// Get the rigidbody
// If you are making a 2D game, you should use Rigidbody2D
// The rigidbody will simulate actual physics. I tested this script, the
// rigibody will accelerate and will need time to slow down upon breaking
// You can change it's mass and stuff
rb = GetComponent<Rigidbody>();
// Now in this case we just get any collider. You can be more specific, if you know which collider your gameobjects has
// e.g. BoxCollider or SphereCollider
// If you are making a 2D game, you should use Collider2D
col = GetComponent<Collider>();
}
void Update ()
{
if (moveLeft)
{
// If you make a 2D game, use Vector2
rb.AddForce(Vector3.left * speed);
}
}
public void MoveLeft()
{
moveLeft = true;
}
public void StopMovingLeft()
{
moveLeft = false;
}