inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

게임 오브젝트 던지기 질문

729

chvj7567

작성한 질문수 7

0

안녕하세요 강사님 배운 것을 토대로 게임도 만들어보고 2번째 게임 제작 중입니다.
게임 오브젝트를 드래그 앤 드롭으로 던지면 해당 속도만큼 게임 오브젝트가 날라가는 것을 구현하려고 합니다.
해당 구현부만 테스트 중이며 구글링으로는 마우스 클릭 시 오브젝트가 날라가는(?) 형식의 글 밖에 안보여서 질문드립니다.
제 나름대로 어느정도 구현을 하였는데 마우스 드래그 시작 시 이전 속도를 없애는 코드가 작동하지 않습니다.
그리고 귀찮으실 수 있겠지만 실제 게임에서는 구현을 어떤 식으로 하는지 궁금합니다.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class Test : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    Rigidbody rb;
    float y;

    float startTime, endTime;
    Vector3 startPostion, endPostion;

    private void Awake()
    {
        // y축 고정
        y = transform.position.y;
        rb = GetComponent<Rigidbody>();
    }

    // 드래그 중일 시 해당 객체가 따라오도록 설정
    public void OnDrag(PointerEventData eventData)
    {
        transform.position = GetPosition(eventData);
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        startTime = Time.time;
        startPostion = GetPosition(eventData);
        
        // 드래그 시작 시 속도를 0으로 만듬(작동안함)
        rb.velocity = Vector3.zero;
    }

    // 드래그 종료 시 속도를 구해 해당 방향으로 날려보냄
    public void OnEndDrag(PointerEventData eventData)
    {
        endTime = Time.time;
        endPostion = GetPosition(eventData);

        // 속도 = 이동거리 / 걸린시간
        Vector3 dir = (endPostion - startPostion).normalized;
        float dis = (endPostion - startPostion).magnitude;
        float speed = dis / (endTime - startTime);

        // 해당 방향으로 속도의 10배에 가하는 힘을 가한다.
        rb.AddForce(dir * speed * 10f);
    }

    // 레이캐스트는 해당 객체가 아닌 해당 객체 뒤의 물체에 하며, 그 물체의 좌표를 반환
    Vector3 GetPosition(PointerEventData eventData)
    {
        RaycastHit[] hits;
        Ray ray = Camera.main.ScreenPointToRay(eventData.position);
        //Debug.DrawRay(Camera.main.transform.position, ray.direction * 100f, Color.red, 1.0f);
        hits = Physics.RaycastAll(ray, 1000f);

        foreach (RaycastHit hit in hits)
        {
            if (hit.collider.name != transform.name)
            {
                return new Vector3(hit.point.x, y, hit.point.z);
            }
        }

        return transform.position;
    }
}

C# unity

답변 1

0

Rookiss

실제 제작과 관련된 질문은 시간 관계상 도움을 드릴수 없습니다.
그리고 실전에선 어떻게 제작하느냐 << 도 정말 의미가 없습니다.
프로젝트가 100개면 100개에서 다 작업 방식이 다르고
지금 질문자처럼 ?의 상황에서 시작해서 이것저것 헤딩하다가
결과물이 나온 방법으로 만드는 것이지,
수학 문제처럼 답이 존재하는 것이 아닙니다.

UI가 아닌 오브젝트들은 굳이 IBegin~~ 시리즈를 사용할 필요가 없는데요.
또한 드래그드롭으로 던질 요령이라면, angry birds 시리즈가 생각납니다.
아주 유명한 게임 모작은 다 튜토리얼이 존재합니다.
https://www.youtube.com/watch?v=QM8M0RainRI

0

chvj7567

답변 감사합니다. 참조하겠습니다. 하지만 제가 보여드린 코드는 앵그리 버드와 같이 새총 형태가 아니라 게임 오브젝트를 클릭 후 드래그 중에는 해당 오브젝트와 동일 시 판단하여 집어 던질 때, 마우스의 드래그 속도에 따라 날라가는 물리 현상을 접목하고 싶었습니다.

IBegin 시에 시작시간을 잡으니 드래그 중일 때 게임 오브젝트를 잡고 있다가 나중에 던질 경우에는 걸린 시간이 길어져 날라가지를 않네요. 마우스의 이동 속도와 Rigidbody의 속도를 연결시킬 수 있는 방법이 있나요?

ResourceManager 클래스 관련 질문

1

18

2

몬스터 HP 게이지바 이동

0

20

1

매니저 관련 질문이 있습니다.

0

68

2

비쥬얼 스튜디오에서 unity연결이 없습니다.

0

74

2

UI 기능 관련 질문이 있습니다!

0

70

2

픽셀 좌표 스크린 좌표

0

48

0

전체적으로 코드 읽는게 굉장히 오래 걸리네요...

0

103

2

카메라 #2 수업 캐릭터 쓰러짐 해결

0

95

1

플레이어 움직임이 끝날때, 기울어짐 현상

0

99

1

Input 적용과 관련하여 질문 있습니다.

0

90

1

디버그 불가.. Unity에 연결 불가

0

98

1

달리기 애니메이션 에러

0

98

2

오랜만에 게임을 만들다가 사운드 관련해서 뭔가 궁금한게 있어서 봤습니다

0

75

1

GetKey 오류

0

128

2

에셋을 어디에 올려두신지 알 수 있나요?

0

114

1

재귀호출? 오류나는데 왜 이래요 ?

0

177

6

Animation blending 파라미터 계산

0

75

1

newPos와 to지점이 겹쳐져야 하는거 아닌가요?

0

112

3

오브젝트 복제하니까 자꾸 이런게 뜨면서 꺼집니다

0

96

2

질문있습니다

0

155

2

아 이거 소스코드 같은거 없나요?

0

152

3

질문 드립니다. string.IsNullOrEmpty(name)

0

94

2

@Managers 가 씬에 배치되어 있어도 문제가 되지 않나요?

0

139

2

유니티6 NavMesh 안되는분들

1

192

1