Вы можете проверить, находится ли игрок на той границе, которую вы определяете как границу карты.
Если вы проверите это для осей x и y соответственно, вы можете привязать его ось x или y к границе, а не дальше.
Вот пример написанного мной ранее сценария, который делает это.
Если я вас правильно понял, вы хотели бы двигаться по диагонали. В моем примере сценария ниже вы можете двигаться как по прямой, так и по диагонали, вы также можете деформировать края или останавливаться на краях, как вы говорили о желании.
Этот сценарий немного более продвинутый, чем то, что вам, вероятно, нужно, поэтому дайте мне знать, если что-то в нем вас смущает.
Обратите внимание, что если вы установите для логического _ShouldWarp значение false, он остановится на границе, в противном случае он будет деформироваться от края к краю карты.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float _Speed = 5f;
public WorldBounds _WorldBounds;
public bool _ShouldWarp; //If _ShouldWarp is false, will block players movement instead.
void Update()
{
Move();
WarpIfAtBoundary();
}
void Move()
{
float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");
transform.Translate(Vector3.right * Time.deltaTime * _Speed * horizontal);
transform.Translate(Vector3.up * Time.deltaTime * _Speed * vertical);
}
void WarpIfAtBoundary()
{
//X Axis
//If player is at positive X boundary
if (transform.position.x > (_WorldBounds.xPlus + _WorldBounds.xBuffer))
{
if (_ShouldWarp) //Teleport/warp player is set to enabled
{
transform.position = new Vector3(_WorldBounds.xMinus, transform.position.y, transform.position.z);
}
else //Otherwise keep player in border position
{
transform.position = new Vector3(_WorldBounds.xPlus + _WorldBounds.xBuffer, transform.position.y, transform.position.z);
}
}
//Else if player is at negative X boundary
else if (transform.position.x < (_WorldBounds.xMinus - _WorldBounds.xBuffer))
{
if (_ShouldWarp)//Teleport/warp player is set to enabled
{
transform.position = new Vector3(_WorldBounds.xPlus, transform.position.y, transform.position.z);
}
else //Otherwise keep player in border position
{
transform.position = new Vector3(_WorldBounds.xMinus - _WorldBounds.xBuffer, transform.position.y, transform.position.z);
}
}
//Y Axis
//If player is at positive Y boundary
if (transform.position.y > (_WorldBounds.yPlus + _WorldBounds.yBuffer))
{
if (_ShouldWarp)//Teleport/warp player is set to enabled
{
transform.position = new Vector3(transform.position.x, _WorldBounds.yMinus, transform.position.z);
}
else //Otherwise keep player in border position
{
transform.position = new Vector3(transform.position.x, _WorldBounds.yPlus + _WorldBounds.yBuffer, transform.position.z);
}
}
//Else if player is at negative Y boundary
else if (transform.position.y < (_WorldBounds.yMinus - _WorldBounds.yBuffer))
{
if (_ShouldWarp)//Teleport/warp player is set to enabled
{
transform.position = new Vector3(transform.position.x, _WorldBounds.yPlus, transform.position.z);
}
else //Otherwise keep player in border position
{
transform.position = new Vector3(transform.position.x, _WorldBounds.yMinus - _WorldBounds.yBuffer, transform.position.z);
}
}
}
}
//Set as serializable so it displays correctly in Unity's inspector window.
[System.Serializable]
public class WorldBounds
{
[Header("Bounds")]
public float xMinus = -9.4f;
public float xPlus = 9.4f;
public float yMinus = -9.4f;
public float yPlus = 9.4f;
[Header("BufferZone")]
public float xBuffer = 1f;
public float yBuffer = 1f;
}
РЕДАКТИРОВАТЬ:
С вашими дополнениями я смогу назначить движение двум моим кнопкам. Один вверх и вправо, а другой внизу и влево.
void Move()
{
float horizontal = Input.GetAxisRaw("Horizontal");
transform.Translate(Vector3.right * Time.deltaTime * _Speed * horizontal);
transform.Translate(Vector3.up * Time.deltaTime * _Speed * horizontal);
}
Это должно работать, чтобы двигаться по диагонали влево и вниз, а также вверх и вправо.
Я сделал изменение, чтобы использовать горизонтальный вход для движения как по оси X, так и по оси Y.
Мне не нужен варп. Просто ступить на определенные границы
Вы можете установить логическое значение Warp в значение false или удалить части деформации из кода, тогда :-), должно работать.
person
Doh09
schedule
12.02.2018
transform.Translate
вместо использования ваших методовMoveRight()
иMoveLeft()
? (В настоящее время это игнорирует физические объекты, такие как коллайдеры.) - person Ian H.   schedule 12.02.2018