No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Caramelos vecinos

16/31
Recursos

Vamos a limitar el movimiento o intercambio de nuestros caramelos utilizando el motor de física de Unity, estos elementos solo deben moverse entre posiciones vecinas, no a cualquier posición de la grilla.

Para esto, Unity nos permite lanzar un rayo con la función Phisics2D.Raycast() y encontrar al elemento más cercano con el que pueden chocar nuestros elementos.

Aportes 5

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

En Unity tenemos diferentes tipos de objetos: los objetos dinámicos se mueven afectados por la gravedad 💃, los objetos cinemáticos también pueden moverse pero sin estar afectados por la gravedad 🚀 y, por ultimo, los objetos estáticos no pueden moverse ni tampoco están afectados por la gravedad 🌅.

Por defecto, cuando trabajamos con objetos dinámicos para nuestros videojuegos, Unity deshabilita las reglas de la física: la gravedad, las colisiones o los choques entre elementos.

De no ser así, estaríamos muy expuestos a utilizar mucha memoria para hacer todos los cálculos matemáticos de todos nuestros elementos y, en algunos casos, necesitaríamos cálculos para las partes de nuestro personaje que se mueven con delay o efectos por el estilo.

Gracias a los colliders podemos configurar muy fácilmente las formas y tiempos en que nuestros elementos se afectan por las reglas de la física. No lo vamos a necesitar mucho en nuestro proyecto pero, si quieren intentarlo, pueden tomar Curso de C# para Videojuegos para trabajar un videojuego de plataformas.

Muy recomendado lo de revisar el código, así poder tener una base clara de lo que se estamos haciendo, porque al final lo que buscamos todos es aprender y no solo terminar el curso.
Un saludo, excelente curso.😄

O dios mio, hay una Opcion asi para desactivar al propio objeto como detectable en el raycasting.
a mi me tocaba hacer malabares para que funcionara hasta me toco hacer usar capas siendo lasegunda el objeto que va detectar.
<–(x_x)>¬

Yikes al fin mi primer error
No me hace el swipe que debe hacer en este capitulo pero el del capitulo anterior si me sirvió aquí va el código (esta igualito)
Usando el Debug.Log para me di cuenta que la función booleana CanSwipe (la ultima) da false lo que significa que nunca entra a la parte del codigo donde el swpa ocurre pero… ¿porqué?

Cuando sepa que pasa lo publicare por si a alguien mas le ocurrio

<using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Candy : MonoBehaviour
{

    private static Color selectedColor = new Color(0.5f, 0.5f, 0.5f, 1.0f);
    private static Candy previousSelected = null;

    private SpriteRenderer spriteRenderer; //variable privada como componente de un objeto deben ser iniciazliados en el awake
    private bool isSelected = false;

    public int id;

    private Vector2[] adjacentDirections = new Vector2[] //los vectores se pueden inicializar si se colocan corchets y unas llaves adnetro los elementos
    {
        Vector2.up,     //enumerados , variables que ya existen de la libreria
        Vector2.down,
        Vector2.left,
        Vector2.right
    };

    private void Awake()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
    }
    
    private void SelectCandy()
    {
        isSelected = true;
        spriteRenderer.color = selectedColor;
        previousSelected = gameObject.GetComponent<Candy>();
    }

    private void DeselectCandy()
    {
        isSelected = false;
        spriteRenderer.color = Color.white;
        previousSelected = null;
    }

    private void OnMouseDown()
    {
        if(spriteRenderer.sprite == null || BoardManager.sharedInstance.isShifting)
        {
            return;
        }
        if (isSelected)
        {
            DeselectCandy();
        }
        else
        {
            if(previousSelected == null)
            {
                SelectCandy();
            }
            else
            {
                /*SwapSprite(previousSelected);
                previousSelected.DeselectCandy();*/

                Debug.Log(CanSwipe());
                if (CanSwipe())
                {
                    SwapSprite(previousSelected);
                    previousSelected.DeselectCandy();
                }
                else
                {
                    previousSelected.DeselectCandy();
                    SelectCandy();
                    Debug.Log("no puedo cambiar");
                }
                
            }
        }
    }

    public void SwapSprite(Candy newCandy)
    {
        if(spriteRenderer.sprite == newCandy.GetComponent<SpriteRenderer>().sprite)
        {
            return;
        } 

        Sprite oldCandy = newCandy.spriteRenderer.sprite;
        newCandy.spriteRenderer.sprite = this.spriteRenderer.sprite;
        this.spriteRenderer.sprite = oldCandy;

        int tempId = newCandy.id;
        newCandy.id = this.id;
        this.id = tempId;

        Debug.Log("puedo cambiar");

    }

    private GameObject GetNeighbor(Vector2 direction)
    {
        RaycastHit2D hit = Physics2D.Raycast(this.transform.position,
                                         direction);

        if(hit.collider != null)
        {
            return hit.collider.gameObject;

        }
        else
        {
            return null;
            
        }
    }

    private List<GameObject> GetAllNeighbors()
    {
        List<GameObject> neighbors = new List<GameObject>();

        foreach(Vector2 direction in adjacentDirections)
        {
            neighbors.Add(GetNeighbor(direction));
        }

        return neighbors;
    }

    private bool CanSwipe()
    {
        return GetAllNeighbors().Contains(previousSelected.gameObject);
    }
}
>

Genial