есть обьект двгающийся в 4 направления по клеткам, каждый шаг сопровождается анимацией, по окончании которой родительский обьект анимированного обьекта перемещается на 4 единицы в определенную сторону в зависимости от направления.
В аниматоре убрал все плавные переходы, но все равно обьект после того как завершиться анимация перемещается на доли секунды на +8 единиц относительно позиции...
Скрипт C#:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
float Timer;
public float WalkCooldown;
public float EndAnim;
Animator anim;
public AnimationClip Up;
public AnimationClip Left;
public AnimationClip Down;
public AnimationClip Right;
public bool AnimMode;
void Start () {
anim = GetComponent<Animator>();
}
void Update () {
if (Input.GetKey(KeyCode.W) && Timer>= WalkCooldown)
{
Timer = 0;
anim.Play("UpWalk");
Invoke("UpEndAnim", Up.length);
if (AnimMode)
{
Invoke("UpEndAnim", EndAnim);
}
}
if (Input.GetKey(KeyCode.A) && Timer >= WalkCooldown)
{
Timer = 0;
anim.Play("LeftWalk");
Invoke("LeftEndAnim", Left.length);
if (AnimMode)
{
Invoke("LeftEndAnim", EndAnim);
}
}
if (Input.GetKey(KeyCode.S) && Timer >= WalkCooldown)
{
Timer = 0;
anim.Play("DownWalk");
Invoke("DownEndAnim", Down.length);
if (AnimMode)
{
Invoke("DownEndAnim", EndAnim);
}
}
if (Input.GetKey(KeyCode.D) && Timer >= WalkCooldown)
{
Timer = 0;
anim.Play("RightWalk");
Invoke("RightEndAnim", Right.length);
if (AnimMode)
{
Invoke("RightEndAnim", EndAnim);
}
}
Timer += Time.deltaTime;
}
void UpEndAnim ()
{
anim.Play("Default");
transform.position = new Vector3(transform.position.x, transform.position.y +4);
}
void LeftEndAnim()
{
anim.Play("Default");
transform.position = new Vector3(transform.position.x - 4, transform.position.y);
}
void DownEndAnim()
{
anim.Play("Default");
transform.position = new Vector3(transform.position.x, transform.position.y - 4);
}
void RightEndAnim()
{
anim.Play("Default");
transform.position = new Vector3(transform.position.x + 4, transform.position.y);
}
}
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
float Timer;
public float WalkCooldown;
public float EndAnim;
Animator anim;
public AnimationClip Up;
public AnimationClip Left;
public AnimationClip Down;
public AnimationClip Right;
public bool AnimMode;
void Start () {
anim = GetComponent<Animator>();
}
void Update () {
if (Input.GetKey(KeyCode.W) && Timer>= WalkCooldown)
{
Timer = 0;
anim.Play("UpWalk");
Invoke("UpEndAnim", Up.length);
if (AnimMode)
{
Invoke("UpEndAnim", EndAnim);
}
}
if (Input.GetKey(KeyCode.A) && Timer >= WalkCooldown)
{
Timer = 0;
anim.Play("LeftWalk");
Invoke("LeftEndAnim", Left.length);
if (AnimMode)
{
Invoke("LeftEndAnim", EndAnim);
}
}
if (Input.GetKey(KeyCode.S) && Timer >= WalkCooldown)
{
Timer = 0;
anim.Play("DownWalk");
Invoke("DownEndAnim", Down.length);
if (AnimMode)
{
Invoke("DownEndAnim", EndAnim);
}
}
if (Input.GetKey(KeyCode.D) && Timer >= WalkCooldown)
{
Timer = 0;
anim.Play("RightWalk");
Invoke("RightEndAnim", Right.length);
if (AnimMode)
{
Invoke("RightEndAnim", EndAnim);
}
}
Timer += Time.deltaTime;
}
void UpEndAnim ()
{
anim.Play("Default");
transform.position = new Vector3(transform.position.x, transform.position.y +4);
}
void LeftEndAnim()
{
anim.Play("Default");
transform.position = new Vector3(transform.position.x - 4, transform.position.y);
}
void DownEndAnim()
{
anim.Play("Default");
transform.position = new Vector3(transform.position.x, transform.position.y - 4);
}
void RightEndAnim()
{
anim.Play("Default");
transform.position = new Vector3(transform.position.x + 4, transform.position.y);
}
}