Поворот 2D модели относительно положения курсора

Еще одна полезная мелочь для двухмерного платформера, где вы управляете персонажем, который может двигаться только по ости Х. Ну и прыгает еще, разумеется. Игра с видом сбоку, короче говоря, и стрельбой. То есть, смысл в том, чтобы персонаж мог поворачиваться лицом не только в ту сторону, которую идет, но и следил за положением курсора. Например, если курсор в левой части экрана, разворот влево. Если например, движение вправо и персонаж смотрит тоже вправо соответственно, а курсор с левой стороны, то разворота не будет, но если при этом нажать кнопку стрельбы – разворот на курсор. Плюс, добавим небольшую фишку, чтобы можно было двигать персонажа, удерживая правую кнопку мыши.

Собственно, сам скрипт PlatformerCharacter, тут уже встроена возможность управления, поэтому можно сразу цеплять его на модельку перса, или же, скопировать некоторые части в свой скрипт:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(Rigidbody2D))]

public class PlatformerCharacter : MonoBehaviour {

	public KeyCode left = KeyCode.A;
	public KeyCode right = KeyCode.D;
	public float speed = 1.5f;
	public Camera mainCamera;
	public bool facingRight = true; // на старте, персонаж смотрит вправо?
	private Vector3 theScale;
	private Rigidbody2D body;
	private Vector3 pos;
	private float h;

	void Awake () 
	{
		body = GetComponent<Rigidbody2D>();
		theScale = transform.localScale;
	}

	void FixedUpdate()
	{
		// добавляем ускорение
		body.AddForce(Vector2.right * h * speed * body.mass * 100);		

		if(Mathf.Abs(body.velocity.x) > speed) // если скорость тела превышает установленную, то выравниваем ее
			body.velocity = new Vector2(Mathf.Sign(body.velocity.x) * speed, body.velocity.y);
	}

	// разворот относительно позиции курсора
	void LookAtCursor()
	{
		if(Input.mousePosition.x < pos.x && facingRight) Flip();
		else if(Input.mousePosition.x > pos.x && !facingRight) Flip();
	}

	void Update () 
	{
		if(Input.GetKey(left)) h = -1; else if(Input.GetKey(right)) h = 1; else h = 0;

		if(Input.GetMouseButton(1)) // если нажата ПКМ, персонаж будет двигаться в сторону курсора
			if(facingRight) h = 1; else h = -1;

		// переносим позицию из мировых координат в экранные
		pos = mainCamera.WorldToScreenPoint(transform.position);

		if(h == 0) LookAtCursor();

		if(!Input.GetMouseButton(0)) // если ЛКМ (стрельба) не нажата, разворот по вектору движения
		{
			if(h > 0 && !facingRight) Flip(); else if(h < 0 && facingRight) Flip();
		}
		else 
		{
			LookAtCursor();
		}
	}

	void Flip() // отразить по горизонтали
	{
		facingRight = !facingRight;
		theScale.x *= -1;
		transform.localScale = theScale;
	}
}

Необходимые комментарии присутствуют. Смотрим, пробуем.

Комментариев 1

Офлайн
Круто!Спасибо вам.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Дешевый хостинг
  • Яндекс.Метрика