forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
//GridMovement.cs
 | 
						|
using System.Collections;
 | 
						|
using System.Collections.Generic;
 | 
						|
using UnityEngine;
 | 
						|
 | 
						|
public class GridMovement : MonoBehaviour
 | 
						|
{
 | 
						|
    [SerializeField] private float moveTime = 0.3f;
 | 
						|
    [SerializeField] private AnimationCurve spacing;
 | 
						|
    
 | 
						|
    private bool isMoving;
 | 
						|
    private Animator animator;
 | 
						|
    private MapInfo map;
 | 
						|
 | 
						|
    void Start()
 | 
						|
    {
 | 
						|
        animator = GetComponent<Animator>();
 | 
						|
        animator.SetFloat("y", -1);
 | 
						|
        map = FindObjectOfType<MapInfo>();
 | 
						|
    }
 | 
						|
 | 
						|
    private void Update()
 | 
						|
    {
 | 
						|
        if (Input.GetKeyDown(KeyCode.W)) 
 | 
						|
        {
 | 
						|
            Walk(Vector3.up);
 | 
						|
        }
 | 
						|
        else if (Input.GetKeyDown(KeyCode.S))
 | 
						|
        {
 | 
						|
            Walk(Vector3.down);
 | 
						|
        }
 | 
						|
        else if (Input.GetKeyDown(KeyCode.A))
 | 
						|
        {
 | 
						|
            Walk(Vector3.left);
 | 
						|
        }
 | 
						|
        else if (Input.GetKeyDown(KeyCode.D))
 | 
						|
        {
 | 
						|
            Walk(Vector3.right);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public bool Walk(Vector3 direction)
 | 
						|
    {
 | 
						|
        if (isMoving) 
 | 
						|
            return false;
 | 
						|
    
 | 
						|
        if (!IsPositionWalkable(transform.position + direction))
 | 
						|
            return false;
 | 
						|
        
 | 
						|
        StartCoroutine(WalkCoroutine(direction, moveTime));
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    private bool IsPositionWalkable(Vector3 pos)
 | 
						|
    {
 | 
						|
        if (Physics2D.OverlapPoint(pos) != null)
 | 
						|
            return false;
 | 
						|
 | 
						|
        if (map != null)
 | 
						|
        {
 | 
						|
            return map.IsPositionInBounds(pos);
 | 
						|
        }
 | 
						|
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    private IEnumerator WalkCoroutine(Vector3 direction, float duration)
 | 
						|
    {
 | 
						|
        Vector3 from = transform.position;
 | 
						|
        Vector3 to = from + direction;
 | 
						|
 | 
						|
        animator.SetFloat("x", direction.x);
 | 
						|
        animator.SetFloat("y", direction.y);
 | 
						|
        animator.SetFloat("speed", 1f);
 | 
						|
        if (duration < float.Epsilon)
 | 
						|
        {
 | 
						|
            transform.position = to;
 | 
						|
            yield break;
 | 
						|
        }
 | 
						|
 | 
						|
        isMoving = true;
 | 
						|
        float aggregate = 0;
 | 
						|
        while (aggregate < 1f)
 | 
						|
        {
 | 
						|
            aggregate += Time.deltaTime / duration;
 | 
						|
            transform.position = Vector3.Lerp(from, to, spacing.Evaluate(aggregate));
 | 
						|
            yield return null;
 | 
						|
        }
 | 
						|
        isMoving = false;
 | 
						|
        animator.SetFloat("speed", 0f);
 | 
						|
    }
 | 
						|
}
 |