• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

게임 오브젝트 던지기 질문

22.03.07 14:44 작성 조회수 528

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;
    }
}

답변 1

답변을 작성해보세요.

0

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

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

태상규님의 프로필

태상규

질문자

2022.03.07

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

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