구현 코드에 대해 간략하게 설명하자면,
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
'개발 > 앱' 카테고리의 다른 글
[추억의 오락실게임] 블랙타이거 원코인 엔딩 못보기 (아놔 어렵네용) (0) | 2017.03.27 |
---|---|
[추억의 야구게임] 베이스볼 스타즈 2 (아놔 WBC 도 졌는데 이걸로나 이겨봐야겠따) (0) | 2017.03.25 |
[추억의 오락실게임] 이거 오락실에서 끝판까지 갈려면 집 한채 날려야함 (Astyanax) (0) | 2017.03.25 |
[아재의 오락실게임 다시해보기 1탄] 에어로파이터2 / 초천재 아재의 게임실력 (0) | 2017.03.23 |
대박 중독성 게임 닌자의 길 (The Way of the Ninja) 인터넷 무설치 플레쉬게임 (0) | 2017.03.22 |
[플레쉬게임] 숲속의 불꽃소년과 물의소녀 (Fireboy and Watergirl in the Forest 2) (0) | 2017.03.21 |
모바일 커플게임 '류토끼와 김토끼' 둘이서 즐겨보세요 (0) | 2017.03.21 |
[Unity 비트맵 폰트 사용방법] 무료 배포 버젼 (Unity fnt 폰트 import) (4) | 2017.03.17 |
최근댓글