유니티는 피벗 회전 처리하기가 까다로운것 같다.

캐주얼 게임에 쓰일법한 상자 굴리기는 과연 어떻게 만드는걸까?

 

부모 오브젝트를 이용한 피벗회전을 이용하면 되지만, 90도 한번만 굴리는게 아닌

지속적으로 굴리는건 어떻게 할까 궁금해져서 구현해봤다.

 

자식 cube의 원하는 방향의 아랫쪽 모서리에 새로운 gameobject 를 만들어 위치시키고 자식cube의 부모로 setParent() 해준다. 그리고 Dotween으로 부모를 굴려주면 끝. 그리고 항상 기존의 피벗인 부모는 삭제시킨다.

깔끔하게 해결되었다.

 

https://github.com/nectar3/CubeRotateTurn

 

GitHub - nectar3/CubeRotateTurn: d

d. Contribute to nectar3/CubeRotateTurn development by creating an account on GitHub.

github.com

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;


public class Rotation : MonoBehaviour
{
    public float rotSpeed = 1f;

    private Transform parent;
    float cubeHalf = 0.5f;

    bool turning = false;

    private void Start()
    {
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.D))
        {
            TurnToX(1);
        }
        else if (Input.GetKeyDown(KeyCode.A))
        {
            TurnToX(-1);
        }
        else if (Input.GetKeyDown(KeyCode.W))
        {
            TurnToZ(1);
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            TurnToZ(-1);
        }
    }

    void TurnToX(int right)
    {
        if (turning) return;
        turning = true;
        DestroyParent();
        GameObject go = new GameObject("Pivot_parent");
        parent = go.transform;
        parent.position = new Vector3(transform.position.x + cubeHalf * right, transform.position.y + -cubeHalf, transform.position.z);
        this.transform.SetParent(parent);
        parent.DORotate(new Vector3(0f, 0f, -90f * right), 0.3f)
            .SetEase(Ease.Linear)
            .OnComplete(() => turning = false);
    }
    void TurnToZ(int forward)
    {
        if (turning) return;
        turning = true;
        DestroyParent();
        GameObject go = new GameObject("Pivot_parent");
        parent = go.transform;
        parent.position = new Vector3(transform.position.x, transform.position.y + -cubeHalf, transform.position.z + cubeHalf * forward);
        this.transform.SetParent(parent);
        parent.DORotate(new Vector3(90f * forward, 0f, 0f), 0.3f)
            .SetEase(Ease.Linear)
            .OnComplete(() => turning = false);
    }

    void DestroyParent()
    {
        if (parent)
        {
            this.transform.SetParent(null);
            Destroy(parent.gameObject);
        }
    }
}

 

 

 

+ Recent posts