1. 개요

모바일 비행 슈팅 게임 Sky Force 시리즈 게임에서 비행기를 조작할 때 터치한 위치로 비행기가 따라 다닙니다.

비행기에서 먼 곳을 터치하면 터치한 위치로 이동하기 위해 비행기가 움직이고, 비행기가 터치 위치에 도달하면, 터치와 동일한 위치에서 따라 다닙니다.

 

마우스로 조작을 원하시면 하단의 링크를 통해 마우스 입력 버전을 참고해주세요.

2. 코드

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

public class PlayerControl : MonoBehavior
{
	public float moveSpeed = 2f; 	// 비행기의 이동 속도
    
    private Rigidbody2D rigid2D; 	// 비행기의 강체(Rigidbody)
    private bool isFar = false;		// 터치와 비행기의 거리 체크
    private Vector3 inputPosition;	// 터치의 월드 포지션
    private Vector2 moveDir; 		// 화면 터치 시 비행기 이동 방향
    
    void Start () 
    {
    	rigid2D = GetComponent<Rigidbody2D>();
    }
    
    void Update ()
    {
    	if(rigid2D == null || Input.touchCount < 1)	// 강체가 없거나 터치가 없으면 리턴
        	return;
        
        moveDir = Vector2.zero; // 방향 초기화
        
        if(Input.GetTouch(0).phase == TouchPhase.Began)
        {
        	inputPosition = GetInputPosition(Input.GetTouch(0).position);
            
            if (Vector3.Distance(transform.position, inputPosition) > .2f)
            {
            	isFar = true; // 비행기와 터치 사이의 거리가 먼 상태
            }
        }
        
        if(Input.GetTouch(0).phase == TouchPhase.Ended)
        {
        	isFar = false;
        }
        
        if(Input.GetTouch(0).phase == TouchPhase.Moved)
        {
        	inputPosition = GetInputPosition(Input.GetTouch(0).position);
            
            if (isFar) // 거리가 먼 상태
            {
            	moveDir = GetDirection(transform.position, inputPosition);
                
                // 터치와 비행기 거리를 체크
                isFar = (Vector3.Distance(transform.position, inputPosition) > .2f);
            }
            else // 터치에 가까운 상태
            {
            	transform.position = inputPosition;
            }
        }
        
        rigid2D.velocity = moveDir * moveSpeed; // 방향에 속도를 곱해서 강체에 적용
    }
    
    // 터치의 스크린 포지션을 월드 포지션으로 변경
    public Vector3 GetInputPosition(Vector3 position)
    {
    	Vector3 screenPosition = position + (Vector3.back * Camera.main.transform.position.z);
        return Camera.main.ScreenToWorldPoint(screenPosition);
    }
    
    // 두 포지션 사이의 방향 
    public Vector2 GetDirection (Vector2 from, Vector2 to)
    {
        Vector2 delta = to - from;
        float radian = Mathf.Atan2(delta.y, delta.x);

        return new Vector2(Mathf.Cos(radian), Mathf.Sin(radian));
    }
}

3. 사용방법

- 움직이려는 물체(비행기)에 Rigidbody2D 컴포넌트가 포함되어 있어야합니다.

- 비행기 속도는 터치와의 거리가 먼 상태에서 적용됩니다.

- 에디터에서 테스트 하기 위해서는 터치 입력부분을 아래 마우스 입력 버전을 참고하세요.

 

[Unity,C#] 2D 비행 슈팅 조작 스크립트 작성 (마우스 입력)

 

[Unity,C#] 2D 비행 슈팅 조작 스크립트 작성 (마우스 입력)

1. 개요 비행슈팅 조작법을 터치에서 마우스로 변경한 코드입니다. 2. 코드 using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerControl : MonoBehavior { publ..

www.dasony.net

 

반응형