-
카테고리
-
세부 분야
게임 프로그래밍
-
해결 여부
미해결
게임 오브젝트 던지기 질문
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;
}
}
답변을 작성해보세요.
0
Rookiss
지식공유자2022.03.07
실제 제작과 관련된 질문은 시간 관계상 도움을 드릴수 없습니다.
그리고 실전에선 어떻게 제작하느냐 << 도 정말 의미가 없습니다.
프로젝트가 100개면 100개에서 다 작업 방식이 다르고
지금 질문자처럼 ?의 상황에서 시작해서 이것저것 헤딩하다가
결과물이 나온 방법으로 만드는 것이지,
수학 문제처럼 답이 존재하는 것이 아닙니다.
UI가 아닌 오브젝트들은 굳이 IBegin~~ 시리즈를 사용할 필요가 없는데요.
또한 드래그드롭으로 던질 요령이라면, angry birds 시리즈가 생각납니다.
아주 유명한 게임 모작은 다 튜토리얼이 존재합니다.
https://www.youtube.com/watch?v=QM8M0RainRI
태상규
질문자2022.03.07
답변 감사합니다. 참조하겠습니다. 하지만 제가 보여드린 코드는 앵그리 버드와 같이 새총 형태가 아니라 게임 오브젝트를 클릭 후 드래그 중에는 해당 오브젝트와 동일 시 판단하여 집어 던질 때, 마우스의 드래그 속도에 따라 날라가는 물리 현상을 접목하고 싶었습니다.
IBegin 시에 시작시간을 잡으니 드래그 중일 때 게임 오브젝트를 잡고 있다가 나중에 던질 경우에는 걸린 시간이 길어져 날라가지를 않네요. 마우스의 이동 속도와 Rigidbody의 속도를 연결시킬 수 있는 방법이 있나요?
답변 1