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:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

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