Включить отключить Rigidbody 2D при запуске сенсорной фазы? - PullRequest
0 голосов
/ 25 октября 2019

Здравствуйте, я с трудом пытаюсь включить и отключить кинематику твердого тела. 2d Я проводил некоторые эксперименты, но, похоже, ничего не получилось. Это код без моих экспериментов о том, как включить и отключить

* 1002. * для фона, когда я играю в головоломку 2d, он использует коробочный коллайдер 2d для сопоставления фигур, у меня есть много фигур, и я хочу, чтобы они падали под действием силы тяжести, касались их и перетаскивали на свои места, для этого я добавилтвердое тело, и оно отлично работает на фалл, но мне нужно, чтобы оно было кинематическим, чтобы я мог перетащить его
    [SerializeField]
    private Transform El_carmenPlace;
    private Vector2 initialPosition;
    private float deltaX, deltaY;
    public static bool locked;

    private void Update()
    {
        if (Input.touchCount > 0 && !locked)
        {
            Touch touch = Input.GetTouch(0);

            Vector2 touchPos = Camera.main.ScreenToWorldPoint(touch.position);


            switch (touch.phase)
            {
                case TouchPhase.Began:

                    if (GetComponent<Collider2D>() == Physics2D.OverlapPoint(touchPos))
                    {
                        deltaX = touchPos.x - transform.position.x;
                        deltaY = touchPos.y - transform.position.y;
                    }

                    break;
                case TouchPhase.Moved:

                    if (GetComponent<Collider2D>() == Physics2D.OverlapPoint(touchPos))
                        transform.position = new Vector2(touchPos.x - deltaX, touchPos.y - deltaY);
                    break;
                case TouchPhase.Ended:
                    initialPosition = transform.position;
                    if (Mathf.Abs(transform.position.x - El_carmenPlace.position.x) <= 0.5f &&
                        Mathf.Abs(transform.position.y - El_carmenPlace.position.y) <= 0.5f)
                    {

                        transform.position = new Vector2(El_carmenPlace.position.x, El_carmenPlace.position.y);
                        locked = true;
                    }
                    else
                    {
                        transform.position = new Vector2(initialPosition.x, initialPosition.y);


                    }

                    break;
            }

        }
    }

}

Я попытался включить отключить ragdoll, сценарии, что единство, я создал пустой объект ипытался добавить часть головоломки, но я не могу? использует жесткое тело 2d Незнайка, если он движется как твердое тело ...

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

По сути, я исправил две основные проблемы, теперь для выигрышной части, которую я использую, если (ALtzayanca.locked && Huamantla.locked && El_carmen.locked) я хочу использовать тег или что-то еще, чтобы, когда все заблокировано, вы выиграли

[SerializeField]
private Transform HuamantlPlace;
private float deltaX, deltaY;
public static bool locked;


//use this for initialiozation
void Start()
{

}


private void Update()
{

    if (Input.touchCount > 0 && !locked)
    {
        Touch touch = Input.GetTouch(0);
        Vector2 touchPos = Camera.main.ScreenToWorldPoint(touch.position);
        switch (touch.phase)
        {
            case TouchPhase.Began:


                if (GetComponent<Collider2D>() == Physics2D.OverlapPoint(touchPos))
                {
                    gameObject.GetComponent<Rigidbody2D>().isKinematic = true;
                    deltaX = touchPos.x - transform.position.x;
                    deltaY = touchPos.y - transform.position.y;


                }

                break;
            case TouchPhase.Moved:
                if (GetComponent<Collider2D>() == Physics2D.OverlapPoint(touchPos))
                    transform.position = new Vector2(touchPos.x - deltaX, touchPos.y - deltaY);

                break;
            case TouchPhase.Ended:

                if (Mathf.Abs(transform.position.x - HuamantlPlace.position.x) <= 0.5f &&
                    Mathf.Abs(transform.position.y - HuamantlPlace.position.y) <= 0.5f)
                {
                    this.gameObject.GetComponent<Rigidbody2D>().isKinematic = true;
                    transform.position = new Vector2(HuamantlPlace.position.x, HuamantlPlace.position.y);
                    this.gameObject.GetComponent<Rigidbody2D>().constraints = RigidbodyConstraints2D.FreezePositionX | RigidbodyConstraints2D.FreezePositionY;

                    locked = true;

                }
                else
                {
                    this.gameObject.GetComponent<Rigidbody2D>().isKinematic = false;

                }

                break;
        }

    }
}

}

0 голосов
/ 25 октября 2019

что ж, для божьих новостей я могу включить и отключить силу воли, но есть еще одна проблема, из-за которой кусок головоломки не прикрепляется к своему месту, поэтому он терпит неудачу

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class El_carmen : MonoBehaviour
{
    // Start is called before the first frame update

    [SerializeField]
    private Transform El_carmenPlace;
    private Vector2 initialPosition;
    private float deltaX, deltaY;
    public static bool locked;
    private Rigidbody rb;
    //use this for initialiozation
    void Start()
    {
        rb = this.GetComponent<Rigidbody>();
    }

    private void Update()
    {
        if (Input.touchCount > 0 && !locked)
        {
            Touch touch = Input.GetTouch(0);
            Vector2 touchPos = Camera.main.ScreenToWorldPoint(touch.position);
            switch (touch.phase)
            {
                case TouchPhase.Began:


                    if (GetComponent<Collider2D>() == Physics2D.OverlapPoint(touchPos))
                    {
                        deltaX = touchPos.x - transform.position.x;
                        deltaY = touchPos.y - transform.position.y;
                        rb.isKinematic = true;
                        rb.detectCollisions = true;
                    }

                    break;
                case TouchPhase.Moved:
                    if (GetComponent<Collider2D>() == Physics2D.OverlapPoint(touchPos))
                        transform.position = new Vector2(touchPos.x - deltaX, touchPos.y - deltaY);

                    break;
                case TouchPhase.Ended:
                    initialPosition = transform.position;
                    if (Mathf.Abs(transform.position.x - El_carmenPlace.position.x) <= 0.5f &&
                        Mathf.Abs(transform.position.y - El_carmenPlace.position.y) <= 0.5f)
                    {

                        rb.MovePosition(transform.position = new Vector2(El_carmenPlace.position.x, El_carmenPlace.position.y));
                        rb.isKinematic = true;
                        rb.detectCollisions = true;
                        locked = true;

                    }
                    else if (locked == false)
                    {
                        transform.position = new Vector2(initialPosition.x, initialPosition.y);
                        rb.isKinematic = false;
                        rb.detectCollisions = false;

                    }

                    break;
            }

        }
    }



}


im пытаюсьс надеждой, что это сработает: c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...