Вот на этом у меня управление со всей анимацией:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
public class Animation : MonoBehaviour
{
//переменная для установки макс. скорости персонажа
public float Speed = 1.5f; // скорость движения
public float maxSpeed = 10f;
//переменная для определения направления персонажа вправо/влево
private bool isFacingRight = true;
//ссылка на компонент анимаций
private Animator anim;
//находится ли персонаж на земле или в прыжке?
private bool isGrounded = false;
//ссылка на компонент Transform объекта
//для определения соприкосновения с землей
public Transform groundCheck;
//радиус определения соприкосновения с землей
private float groundRadius = 0.2f;
//ссылка на слой, представляющий землю
public LayerMask whatIsGround;
private Rigidbody2D body;
private int layerMask;
/// <summary>
/// Начальная инициализация
/// </summary>
private void Start()
{
body = GetComponent<Rigidbody2D>();
body.freezeRotation = true;
layerMask = 1 << gameObject.layer | 1 << 2;
layerMask = ~layerMask;
anim = GetComponent<Animator>();
}
/// <summary>
/// Выполняем действия в методе FixedUpdate, т. к. в компоненте Animator персонажа
/// выставлено значение Animate Physics = true и анимация синхронизируется с расчетами физики
/// </summary>
private void FixedUpdate()
{
{
{
}
{
//определяем, на земле ли персонаж
isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundRadius, whatIsGround);
//устанавливаем соответствующую переменную в аниматоре
anim.SetBool ("Ground", isGrounded);
//устанавливаем в аниматоре значение скорости взлета/падения
anim.SetFloat ("vSpeed", GetComponent<Rigidbody2D>().velocity.y);
//если персонаж в прыжке - выход из метода, чтобы не выполнялись действия, связанные с бегом
if (!isGrounded)
return;
//используем Input.GetAxis для оси Х. метод возвращает значение оси в пределах от -1 до 1.
//при стандартных настройках проекта
//-1 возвращается при нажатии на клавиатуре стрелки влево (или клавиши А),
//1 возвращается при нажатии на клавиатуре стрелки вправо (или клавиши D)
float move = Input.GetAxis("Horizontal");
//в компоненте анимаций изменяем значение параметра Speed на значение оси Х.
//приэтом нам нужен модуль значения
anim.SetFloat("Speed", Mathf.Abs(move));
//обращаемся к компоненту персонажа RigidBody2D. задаем ему скорость по оси Х,
//равную значению оси Х умноженное на значение макс. скорости
GetComponent<Rigidbody2D>().velocity = new Vector2(move * maxSpeed, GetComponent<Rigidbody2D>().velocity.y);
//если нажали клавишу для перемещения вправо, а персонаж направлен влево
if(move > 0 && !isFacingRight)
//отражаем персонажа вправо
Flip();
//обратная ситуация. отражаем персонажа влево
else if (move < 0 && isFacingRight)
Flip();
}
}
}
/// <summary>
/// Метод для смены направления движения персонажа и его зеркального отражения
/// </summary>
private void Flip()
{
//меняем направление движения персонажа
isFacingRight = !isFacingRight;
//получаем размеры персонажа
Vector3 theScale = transform.localScale;
//зеркально отражаем персонажа по оси Х
theScale.x *= -1;
//задаем новый размер персонажа, равный старому, но зеркально отраженный
transform.localScale = theScale;
}
}
using System.Collections;
public class Animation : MonoBehaviour
{
//переменная для установки макс. скорости персонажа
public float Speed = 1.5f; // скорость движения
public float maxSpeed = 10f;
//переменная для определения направления персонажа вправо/влево
private bool isFacingRight = true;
//ссылка на компонент анимаций
private Animator anim;
//находится ли персонаж на земле или в прыжке?
private bool isGrounded = false;
//ссылка на компонент Transform объекта
//для определения соприкосновения с землей
public Transform groundCheck;
//радиус определения соприкосновения с землей
private float groundRadius = 0.2f;
//ссылка на слой, представляющий землю
public LayerMask whatIsGround;
private Rigidbody2D body;
private int layerMask;
/// <summary>
/// Начальная инициализация
/// </summary>
private void Start()
{
body = GetComponent<Rigidbody2D>();
body.freezeRotation = true;
layerMask = 1 << gameObject.layer | 1 << 2;
layerMask = ~layerMask;
anim = GetComponent<Animator>();
}
/// <summary>
/// Выполняем действия в методе FixedUpdate, т. к. в компоненте Animator персонажа
/// выставлено значение Animate Physics = true и анимация синхронизируется с расчетами физики
/// </summary>
private void FixedUpdate()
{
{
{
}
{
//определяем, на земле ли персонаж
isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundRadius, whatIsGround);
//устанавливаем соответствующую переменную в аниматоре
anim.SetBool ("Ground", isGrounded);
//устанавливаем в аниматоре значение скорости взлета/падения
anim.SetFloat ("vSpeed", GetComponent<Rigidbody2D>().velocity.y);
//если персонаж в прыжке - выход из метода, чтобы не выполнялись действия, связанные с бегом
if (!isGrounded)
return;
//используем Input.GetAxis для оси Х. метод возвращает значение оси в пределах от -1 до 1.
//при стандартных настройках проекта
//-1 возвращается при нажатии на клавиатуре стрелки влево (или клавиши А),
//1 возвращается при нажатии на клавиатуре стрелки вправо (или клавиши D)
float move = Input.GetAxis("Horizontal");
//в компоненте анимаций изменяем значение параметра Speed на значение оси Х.
//приэтом нам нужен модуль значения
anim.SetFloat("Speed", Mathf.Abs(move));
//обращаемся к компоненту персонажа RigidBody2D. задаем ему скорость по оси Х,
//равную значению оси Х умноженное на значение макс. скорости
GetComponent<Rigidbody2D>().velocity = new Vector2(move * maxSpeed, GetComponent<Rigidbody2D>().velocity.y);
//если нажали клавишу для перемещения вправо, а персонаж направлен влево
if(move > 0 && !isFacingRight)
//отражаем персонажа вправо
Flip();
//обратная ситуация. отражаем персонажа влево
else if (move < 0 && isFacingRight)
Flip();
}
}
}
/// <summary>
/// Метод для смены направления движения персонажа и его зеркального отражения
/// </summary>
private void Flip()
{
//меняем направление движения персонажа
isFacingRight = !isFacingRight;
//получаем размеры персонажа
Vector3 theScale = transform.localScale;
//зеркально отражаем персонажа по оси Х
theScale.x *= -1;
//задаем новый размер персонажа, равный старому, но зеркально отраженный
transform.localScale = theScale;
}
}
А вот этот для сенсорных кнопок:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
public class Controller : MonoBehaviour
{
public Rigidbody2D rb2d;
public float playerSpeed;
public float jumpPower;
public int directionInput;
public bool groundCheck;
public bool facingRight = true;
void Start()
{
rb2d = GetComponent<Rigidbody2D>();
}
void Update()
{
if ((directionInput < 0) && (facingRight))
{
Flip();
}
if ((directionInput > 0) && (!facingRight))
{
Flip();
}
groundCheck = true;
}
void FixedUpdate()
{
rb2d.velocity = new Vector2(playerSpeed * directionInput, rb2d.velocity.y);
}
public void Move(int InputAxis)
{
directionInput = InputAxis;
}
public void Jump(bool isJump)
{
isJump = groundCheck;
if (groundCheck)
{
rb2d.velocity = new Vector2(rb2d.velocity.x, jumpPower);
}
}
void Flip()
{
facingRight = !facingRight;
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}
}
using System.Collections;
public class Controller : MonoBehaviour
{
public Rigidbody2D rb2d;
public float playerSpeed;
public float jumpPower;
public int directionInput;
public bool groundCheck;
public bool facingRight = true;
void Start()
{
rb2d = GetComponent<Rigidbody2D>();
}
void Update()
{
if ((directionInput < 0) && (facingRight))
{
Flip();
}
if ((directionInput > 0) && (!facingRight))
{
Flip();
}
groundCheck = true;
}
void FixedUpdate()
{
rb2d.velocity = new Vector2(playerSpeed * directionInput, rb2d.velocity.y);
}
public void Move(int InputAxis)
{
directionInput = InputAxis;
}
public void Jump(bool isJump)
{
isJump = groundCheck;
if (groundCheck)
{
rb2d.velocity = new Vector2(rb2d.velocity.x, jumpPower);
}
}
void Flip()
{
facingRight = !facingRight;
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}
}
Сенсорные кнопки делаю на канвасах. Добавляю Event Trigger'ы на все три кнопки c Pointer Enter (влево -1, вправо 1, прыжок буль - все понятно). Кнопка прыжок работает отлично - перс прыгает, анимация проигрывается. А вот бегает перс (влево-право) уже без анимации.
Как ̶с̶к̶р̶е̶с̶т̶и̶т̶ь̶ ̶б̶у̶л̶ь̶д̶о̶г̶а̶ ̶с̶ ̶н̶о̶с̶о̶р̶о̶г̶о̶м̶ сделать так чтобы перс смог бегать по сенсорным кнопкам с анимацией? Прыжок работает всегда отлично вместе с анимацией, а вот бегает уже без нее....