본문으로 바로가기

요마전의 궁수스킬에는 일정범위 영역을 유저가 선택하고 공격하는 방식의 스킬이 존재합니다. (마치 메테오처럼?)

팬의 사용효과를 극대화 하기위해서 범위영역까지 유저가 선택할 수 있도록 구현하였습니다.

처음 클릭한 마우스 포지션을 기준으로 마우스를 드래그하여 사각형의 영역을 선택 하고 선택된 영역에 보이지 않는 큐브가 생겨 그 큐브와 접촉하는 모든 적은 데미지를 입는다는것이 스킬의 컨셉입니다.


따라서 위 그림과 같이 첫 지점과 끝지점의 좌표를 구하고 이를 바탕으로 오브젝트 생성코드의 기준좌표를 설정해주고 오브젝트를 생성하는 구문과 실시간으로 화면에 사각형의 UI를 표시해주는 부분을 구현하도록 하였습니다. 단, 이때 주의할 점은 유니티상의 텍스쳐 좌표계의 경우 다음과 같이 표현하도록 되어있기 때문에 변환없이 입력하면 좌우가 상반되어 생성되는 사각형 텍스쳐를 볼 수 있습니다.

따라서 구현시에 텍스쳐의 방향을 바로잡아주는 코드가 필요합니다.


- 유니티에서의 텍스쳐 좌표계는 ST 좌표계


(0,1)        (1,1)                 

+-----+-----+

|     |     |

|     |     |

+-----+-----+

|     |     |

|     |     |

+-----+-----+

(0,0)        (1,0)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
using UnityEngine;
using System.Collections;
 
public class draw : MonoBehaviour
{
    Vector3 first_point;
    Vector3 last_point;
    Vector3 first_vec;
 
    public Texture aTexture;
    public GameObject skill_cube;
 
 
    // 화면상에 사각형 설정영역을 보여주는 부분
    void OnGUI()
    {
 
        if (Input.GetMouseButton(0))
        {
            /* DrawTexture를 이용해서 사각형을 그려줌. 이때, 사각형의 x,y 좌표를 유니티좌표계에 맞게 변환해야함
             * 따라서 x좌표는 그대로 가고, y좌표는 변환이 필요하다 */
            GUI.DrawTexture(new Rect(first_vec.x, first_vec.y, Input.mousePosition.x - first_vec.x, (Screen.height - Input.mousePosition.y) - first_vec.y), aTexture);
 
        }
    }
 
    void Update()
    {
        // 마우스 버튼 드래그시
        if (Input.GetMouseButtonDown(0))
        {
            // Ray 선언부
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitinfo;
 
            // Ray를 쏨
            if (Physics.Raycast(ray, out hitinfo))
            {
                // 첫번째로 화면상에 클릭한 좌표를 저장
                first_point = hitinfo.point;
            }
            Debug.Log("first = " + first_point);
 
            /* first_vec 변수에 클릭한 좌표를 저장,
             * 이때 y포지션의 경우 유니티의 좌표계 기준에 따라 맞게 변환시킴 */
            first_vec.x = Input.mousePosition.x;
            first_vec.y = Screen.height - Input.mousePosition.y;
 
            // Debug.Log(first_vec);
 
 
        }
 
        // 마우스 버튼을 뗏을때
        if (Input.GetMouseButtonUp(0))
        {
            // Ray 선언부
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitinfo;
 
            // Ray를 쏨
            if (Physics.Raycast(ray, out hitinfo))
            {
                // 드래그 후 마우스를 뗀 포지션을 마지막 좌표로 저장
                last_point = hitinfo.point;
            }
 
            //Debug.Log("last.x = " + (last_point.x - first_point.x));
           // Debug.Log("last.x = " + last_point.x - first_point.x);
 
            /* 화면에 그린 사각형 오브젝트를 게임내에서 3D 오브젝트로 생성
             * 생성할때 생성좌표는 first_point(시작점)과 last_point(끝점)을 이용해서 중앙값을 구해서 그 위치에 생성 */
            skill_cube.transform.localScale = new Vector3(last_point.x - first_point.x, 1, last_point.z - first_point.z);
            Instantiate(skill_cube, (first_point + last_point) / 2, Quaternion.identity);
 
        }
    }
}