구현 코드에 대해 간략하게 설명하자면,


1. 먼저 탱크를 마우스 왼쪽 버튼으로 누르면 탄환을 날릴 각도와 파워를 표시해주는 화살표가 나오도록했습니다.


2. 마우스 왼쪽 버튼을 누른 상태로 마우스를 움직여 각도를 조절해주고 탱크로부터 멀리 떨어질수록 파워가 강하게 가까울 수록 파워가 약하게 됩니다.


3. 탄환을 날릴 각도를 정했다면 마우스 왼쪽버튼을 손에서 떼면 탄환이 설정된 각도와 파워로 날라갑니다.


구현을 하면 아래처럼 나옵니다.



구현 코드는 아래와 같습니다.


private void ShotInWindow()

    {

        if (Input.GetMouseButtonDown(0))

        {

            if (tankCollider.OverlapPoint(Camera.main.ScreenToWorldPoint(Input.mousePosition)))

            {

                directionArrow.transform.position = new Vector2(transform.position.x + 1.1f , transform.position.y + 0.75f);

                directionArrow.transform.localScale = new Vector3(1, 1, 1);

                isTargeting = true;

                startAngle = transform.eulerAngles.z;

            }

        }

        else if (Input.GetMouseButton(0) && isTargeting)

        {

            Vector2 target = Camera.main.ScreenToWorldPoint(Input.mousePosition);

            float angle = Mathf.Atan2(transform.position.y - target.y, transform.position.x - target.x);

            float angleDiff = DifferenceBetweenAngles(angle, startAngle);


            if(angle < 1.6f && angle > -0.7f)

                directionArrow.transform.rotation = Quaternion.AngleAxis(angle * Mathf.Rad2Deg, transform.forward);


            Debug.Log(angle + " / " + angleDiff);


            float power = Vector2.Distance(target, transform.position);


            if (Mathf.Abs(power) > cannonGuage)

                power = cannonGuage;

            guageBar.size = power / cannonGuage;


        }

        else if (Input.GetMouseButtonUp(0))

        {

            directionArrow.transform.localScale = new Vector3(0, 0, 0);

            isTargeting = false;

            

            Fire();

        }

    }


    private float DifferenceBetweenAngles(float angle1, float angle2)

    {

        float angle = angle1 - angle2;

        return Mathf.Atan2(Mathf.Sin(angle), Mathf.Cos(angle));

    }



    public void Fire()

    {

        Vector2 direction = directionArrow.transform.rotation * new Vector2(cannonSpeed, 0.0f) * guageBar.size * guageFactor;


        GameObject toInstance = Resources.Load<GameObject>("Prefabs/Cannon1");

        GameObject cannon = Instantiate(toInstance, transform.position, transform.rotation);

        cannon.GetComponent<PlayerCannon>().ShotToTarget(direction);

    }


PlayerCannon 스크립트입니다.^^

public class PlayerCannon : MonoBehaviour {


    private Rigidbody2D rb2d;

    private Vector3 prevPosition;


    void OnEnable()

    {

        rb2d = GetComponent<Rigidbody2D>();

        prevPosition = transform.position;

    }



    // Update is called once per frame

    void FixedUpdate ()

    {

        Vector3 deltaPos = transform.position - prevPosition;

        float angle = Mathf.Atan2(deltaPos.y, deltaPos.x) * Mathf.Rad2Deg

        if (0 != angle)

        {

            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, 0, angle), 10.0f * Time.deltaTime);

            prevPosition = transform.position;

        }

    }


    public void ShotToTarget(Vector2 direction)

    {

        rb2d.velocity = direction;

    }

}


이 코드를 활용해서 탱크게임을 만들어봤어요


탱크2D (마지막한발)


https://play.google.com/store/apps/details?id=com.eyen.tank2d