Я делаю небольшую игру для телефона в единстве, и вся идея игры заключается в том, что каждые 3 секунды вы автоматически прыгаете, и все, что вы можете делать, это контролировать, куда вы идете. Вы цепляетесь за стены и умираете, поражая врагов. Вы должны пройти уровень и достичь цели, чтобы перейти к следующему.
Это мой сценарий, который обрабатывает прыжки, прицеливание и прилипание к стенам игрока. Начиная с rn, если вы прыгаете в стену 2 раза подряд, вы пробиваетесь сквозь нее. Если вы удерживаете палец на экране и прыгаете, линия от средства рендеринга испортится. Я знаю, что есть масса вещей, которые можно сделать лучше.
public class Jump : MonoBehaviour
{
public float power = 10f;
public float maxDrag = 5f;
public Rigidbody2D rb;
public LineRenderer lr;
public UIDocument uiDoc;
public FixedJoint2D fj;
Vector3 dragStartPos;
Touch touch;
private Label jumpLabel;
private bool waitingToJump = false;
private void Start()
{
//gets the visual elements (buttons, labels, etc) in the UI Builder
var rootVisualElement = uiDoc.rootVisualElement;
jumpLabel = rootVisualElement.Q<Label>("time");
}
private void Update()
{
//checks to see if AutoJump is running, if not it starts it
if (waitingToJump == false)
{
StartCoroutine(AutoJump());
waitingToJump = true;
}
//drag input check
if (Input.touchCount > 0)
{
touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began)
{
DragStart();
}
if (touch.phase == TouchPhase.Moved)
{
Dragging();
}
if (touch.phase == TouchPhase.Ended)
{
DragRelease();
}
}
}
//called on first touch
void DragStart()
{
dragStartPos = Camera.main.ScreenToWorldPoint(touch.position);
dragStartPos.z = 0f;
lr.positionCount = 1;
lr.SetPosition(0, dragStartPos);
}
//called while dragging
void Dragging()
{
Vector3 draggingPos = Camera.main.ScreenToWorldPoint(touch.position);
draggingPos.z = 0f;
lr.positionCount = 2;
lr.SetPosition(1, draggingPos);
}
//called when released
void DragRelease()
{
Vector3 dragReleasePos = Camera.main.ScreenToWorldPoint(touch.position);
dragReleasePos.z = 0f;
lr.positionCount = 0;
}
//Jump every 3 seconds
IEnumerator AutoJump()
{
yield return new WaitForSeconds(0.25f);
jumpLabel.text = "3";
yield return new WaitForSeconds(1);
jumpLabel.text = "2";
yield return new WaitForSeconds(1);
jumpLabel.text = "1";
yield return new WaitForSeconds(1);
Vector3 dragReleasePos = Camera.main.ScreenToWorldPoint(touch.position);
dragReleasePos.z = 0f;
lr.positionCount = 0;
Vector3 force = dragStartPos - dragReleasePos;
Vector3 clampedForce = Vector3.ClampMagnitude(force, maxDrag) * power;
jumpLabel.text = "JUMP";
//unsticks player from wall by setting the fixed joint to itself
fj.connectedBody = rb;
rb.AddForce(clampedForce, ForceMode2D.Impulse);
waitingToJump = false;
DragRelease();
}
//Sticks player to wall on contact
private void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.tag == "Wall")
{
fj.connectedBody = col.gameObject.GetComponent<Rigidbody2D>();
}
}
}
Большое спасибо!
