Единство отключить дочернее вращение - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть одна проблема в единстве 2d с моим объектом, когда я стреляю стрелкой в ​​коллайдер коробки с другим элементом, и когда он попадает в дочерний элемент, я имею в виду, что стрелка становится дочерним элементом родителя (BOX), дочерний элемент начинаетповернуть влево и вправо .. Я действительно хочу отключить левое и правое вращение дочернего элемента .. поле (родительский элемент) по-прежнему необходимо повернуть так же, как это было раньше .. У меня есть такой код и моя стрелка вHardbody2d находится в кинематическом режиме ...

это сценарий стрелки ..

{
    public float flySpeed = 20f;
    private Rigidbody2D arrowBody;
    private bool shouldFly;


    // Start is called before the first frame update
    void Start()
    {
        shouldFly = true;
        arrowBody = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        if (shouldFly == true)
        {
            //make our pin fly
            arrowBody.MovePosition(arrowBody.position + Vector2.up * flySpeed * Time.deltaTime);
        }
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.tag == "target")
        {

            shouldFly = false;
            transform.SetParent(collision.gameObject.transform);


        } else if(collision.tag == "arrow")
        {

            SceneManager.LoadScene("quickGameOverScene");
        }
    }
}

1 Ответ

0 голосов
/ 21 февраля 2019

Я действительно запутался в том, что вы пытаетесь сделать.Я не понимаю, хотите ли вы заморозить вращение или движение, поэтому я опубликую ответы на оба вопроса.Чтобы предотвратить перемещения и повороты, вызванные родительским объектом, вы можете использовать LateUpdate, например:

Quaternion InitRot;
Vector3 InitPos;

void Start () {
    InitRot = transform.rotation;
    InitPos = transform.position;
}
void Update()
{
    //figuring out when to save position when attached to BOX
    if(gameObject.transform.parent == null)
    {
        InitRot = transform.rotation;
        InitPos = transform.position;
    }
}
void LateUpdate () {
    //If attached to box do not translate do not rotate
    if (gameObject.transform.parent != null)
    {
        transform.rotation = InitRot;
        transform.position = InitPos;
    }
}

. Более подробную информацию об этом решении можно получить по адресу здесь

* 1008.* РЕДАКТИРОВАТЬ Так как ответ выше не сработал для ОП.Я понял, в чем проблема.Код ОП отлично подходит для перемещения стрелки, но проблема, скорее всего, в том, где он вращает коробку.

Если он вращает коробку с помощью transform.Rotate(Vector3.forward* 90), то будет искажение, вызванное одинаковым количеством вращения в каждомUpdate, поскольку время кадров не одинаково в каждом Update.Поэтому ему нужно повернуть прямоугольник, используя Time.deltaTime для последовательного поворота, например: transform.Rotate(Vector3.forward* 90*Time.deltaTime); Это вращает прямоугольник на одинаковую величину в каждом временном интервале и устраняет искажения.Это сценарии, которые я использовал для этой задачи, и она работает для меня.

Скрипт для стрелки:

public float flySpeed = 20f;
private Rigidbody2D arrowBody;
private bool shouldFly;
private Vector2 initPos;
private Quaternion initRot;
// Start is called before the first frame update
void Start()
{
    shouldFly = true;
    arrowBody = GetComponent<Rigidbody2D>();
    //arrowBody.isKinematic = true;
    initPos = gameObject.transform.position;
    initRot = gameObject.transform.rotation;
}

// Update is called once per frame
void Update()
{
    if (shouldFly == true)
    {         
        //make our pin fly
        arrowBody.MovePosition(arrowBody.position + Vector2.up * flySpeed * Time.deltaTime);
    }
    if(gameObject.transform.parent == null)
    {
        initPos = gameObject.transform.position;
        initRot = gameObject.transform.rotation;
    }

}
void LateUpdate()
{
    if (gameObject.transform.parent != null)
    {
        gameObject.transform.position = initPos;
        gameObject.transform.rotation = initRot;
    }
}

private void OnTriggerEnter2D(Collider2D collision)
{
    Debug.Log("Collision happened");
    if (collision.tag == "target")
    {          
        shouldFly = false;          
        transform.SetParent(collision.gameObject.transform);
    }
    else if (collision.tag == "arrow")
    {

        SceneManager.LoadScene("quickGameOverScene");
    }
}

И Скрипт для вращения окна:

public float rotationSpeed = 70f;
void Update()
{
    transform.Rotate(Vector3.back, rotationSpeed * Time.deltaTime);
}
...