작성
·
683
0
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
답변 감사합니다. 참조하겠습니다. 하지만 제가 보여드린 코드는 앵그리 버드와 같이 새총 형태가 아니라 게임 오브젝트를 클릭 후 드래그 중에는 해당 오브젝트와 동일 시 판단하여 집어 던질 때, 마우스의 드래그 속도에 따라 날라가는 물리 현상을 접목하고 싶었습니다.
IBegin 시에 시작시간을 잡으니 드래그 중일 때 게임 오브젝트를 잡고 있다가 나중에 던질 경우에는 걸린 시간이 길어져 날라가지를 않네요. 마우스의 이동 속도와 Rigidbody의 속도를 연결시킬 수 있는 방법이 있나요?