공격 판정이 잘 안됩니다
620
9 asked
공격 판정이 기사의 발을 클릭해야 공격이 들어갑니다 머리를 클릭하면 RUN상태로 부비부비를 하고 있어요 ㅜㅜ
코드는 강의 그대로 따라했습니다!
============================================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class PlayerController : MonoBehaviour
{
public enum PlayerState
{
Die,
Idle,
Moving,
Skill,
}
int _mask = (1 << (int)Define.Layer.Ground) | (1 << (int)Define.Layer.Monster);
PlayerStat _stat;
Vector3 _destPos;
GameObject _lockTarget;
[SerializeField]
PlayerState _state = PlayerState.Idle;
public PlayerState State
{
get { return _state; }
set
{
_state = value;
Animator anim = GetComponent<Animator>();
switch (_state)
{
case PlayerState.Die:
break;
case PlayerState.Idle:
anim.CrossFade("WAIT00", 0.1f);
break;
case PlayerState.Moving:
anim.CrossFade("RUN00_F", 0.1f);
break;
case PlayerState.Skill:
anim.CrossFade("Attack1", 0.1f, -1, 0);
break;
}
}
}
void Start()
{
#region
// Managers.Input.KeyAction -= OnKeyboard;
// Managers.Input.KeyAction += OnKeyboard;
#endregion
_stat = gameObject.GetComponent<PlayerStat>();
Managers.Input.MouseAction -= OnMouseEvent;
Managers.Input.MouseAction += OnMouseEvent;
Managers.UI.ShowSceneUI<UI_Inven>();
}
void UpdateDie()
{
}
void UpdateMoving()
{
//몬스터가 내 사정거리보다 가까우면 공격
if(_lockTarget != null)
{
float distance = (_destPos - transform.position).magnitude;
if(distance <= 1)
{
State = PlayerState.Skill;
return;
}
}
//이동
Vector3 dir = _destPos - transform.position;
if (dir.magnitude < 0.1f)
{
State = PlayerState.Idle;
}
else
{
NavMeshAgent nma = gameObject.GetOrAddComponent<NavMeshAgent>();
float moveDist = Mathf.Clamp(_stat.MoveSpeed * Time.deltaTime, 0, dir.magnitude);
nma.Move(dir.normalized * moveDist);
Debug.DrawRay(transform.position + Vector3.up * 0.5f , dir.normalized, Color.green);
if(Physics.Raycast(transform.position + Vector3.up * 0.5f, dir, 1.0f, LayerMask.GetMask("Block")))
{
if (Input.GetMouseButton(0) == false)
State = PlayerState.Idle;
return;
}
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(dir), 10 * Time.deltaTime);
}
}
void UpdateIdle()
{
}
void UpdateSkill()
{
if(_lockTarget != null)
{
Vector3 dir = _lockTarget.transform.position - transform.position;
Quaternion quat = Quaternion.LookRotation(dir);
transform.rotation = Quaternion.Lerp(transform.rotation, quat, 20 + Time.deltaTime);
}
}
void OnHitEvent()
{
Debug.Log("OnHitEvent");
if(_stopSkill)
{
State = PlayerState.Idle;
}
else
{
State = PlayerState.Skill;
}
}
void Update()
{
switch (State)
{
case PlayerState.Die:
UpdateDie();
break;
case PlayerState.Moving:
UpdateMoving();
break;
case PlayerState.Idle:
UpdateIdle();
break;
case PlayerState.Skill:
UpdateSkill();
break;
}
}
#region
//void OnKeyboard()
//{
// if (Input.GetKey(KeyCode.W))
// {
// transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.forward), 0.2f);
// transform.position += Vector3.forward * Time.deltaTime * _speed;
// }
// if (Input.GetKey(KeyCode.S))
// {
// transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.back), 0.2f);
// transform.position += Vector3.back * Time.deltaTime * _speed;
// }
// if (Input.GetKey(KeyCode.A))
// {
// transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.left), 0.2f);
// transform.position += Vector3.left * Time.deltaTime * _speed;
// }
// if (Input.GetKey(KeyCode.D))
// {
// transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.right), 0.2f);
// transform.position += Vector3.right * Time.deltaTime * _speed;
// }
// _moveToDest = false;
//}
#endregion
bool _stopSkill = false;
void OnMouseEvent(Define.MouseEvent evt)
{
switch (State)
{
case PlayerState.Idle:
OnMouseEvent_IdleRun(evt);
break;
case PlayerState.Moving:
OnMouseEvent_IdleRun(evt);
break;
case PlayerState.Skill:
{
if(evt == Define.MouseEvent.PointerUp)
_stopSkill = true;
}
break;
}
}
void OnMouseEvent_IdleRun(Define.MouseEvent evt)
{
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
bool raycastHit = Physics.Raycast(ray, out hit, 100.0f, _mask);
// Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red, 1.0f);
switch (evt)
{
case Define.MouseEvent.PointerDown:
{
if (raycastHit)
{
_destPos = hit.point;
State = PlayerState.Moving;
_stopSkill = false;
if (hit.collider.gameObject.layer == (int)Define.Layer.Monster)
_lockTarget = hit.collider.gameObject;
else
_lockTarget = null;
}
}
break;
case Define.MouseEvent.Press:
{
if (_lockTarget == null && raycastHit)
_destPos = hit.point;
}
break;
case Define.MouseEvent.PointerUp:
_stopSkill = true;
break;
}
}
}
Answer 5
5
확인해보니 _target의 y값이 높이 잡혀서 그런 것이네요.
거리 계산 공식에서 y값은 0 혹은 플레이어 높이로 강제로 세팅하도록 수정하면 되겠습니다.
디버깅 영상 메일로 회신 드리니 참고 바랍니다.
1
저도 _destPos.y = 0으로 하니까 문제가 해결되었는데
_destPos = 0으로 해서 문제가 해결이 된 이유가 혹시
_destPos가 현재 Vector3이니까
raycastHit이 된 오브젝트의 y축좌표를 0으로하면 머리꼭대기? 로 _destPos의 y축 좌표가 설정이 되니까(capsule collider의 좌표가 그냥 머리 꼭대기)
그래서 capsule collider어느 부분을 눌러도
Updatemoving에서 인식이 다 되는 것인가요..??
2
위 내용으로 확실히 알 수 없지만 '발'은 대상으로 찍히는 상황이라면
코드 문제가 아니라, 프리팹의 Collision 영역 문제일 확률이 높습니다.
몬스터의 Collider 범위를 살펴보시기 바랍니다.
그래도 해결이 안 되면 전체 프로젝트 압축 후
rookiss@naver.com로 보내주시기 바랍니다.
0
혹시 저도 같은문제가 발생해서 그런데
디버깅영상 부탁드려도 될까요?
gugangmo59@naver.com 가 메일 주소입니다.
0
디버깅 영상은 이미 삭제해서 없습니다 OTL
위와 같은 코드 수정으로 해결이 안 되는지 확인 부탁드리고
원인 파악이 힘들면 rookiss@naver.com로 전체 프로젝트 압축해서 보내주시기 바랍니다.
UI 기능 관련 질문이 있습니다!
0
36
2
픽셀 좌표 스크린 좌표
0
32
0
전체적으로 코드 읽는게 굉장히 오래 걸리네요...
0
73
2
카메라 #2 수업 캐릭터 쓰러짐 해결
0
84
1
플레이어 움직임이 끝날때, 기울어짐 현상
0
83
1
Input 적용과 관련하여 질문 있습니다.
0
75
1
디버그 불가.. Unity에 연결 불가
0
82
1
달리기 애니메이션 에러
0
89
2
오랜만에 게임을 만들다가 사운드 관련해서 뭔가 궁금한게 있어서 봤습니다
0
66
1
GetKey 오류
0
109
2
에셋을 어디에 올려두신지 알 수 있나요?
0
107
1
재귀호출? 오류나는데 왜 이래요 ?
0
169
6
Animation blending 파라미터 계산
0
68
1
newPos와 to지점이 겹쳐져야 하는거 아닌가요?
0
97
3
오브젝트 복제하니까 자꾸 이런게 뜨면서 꺼집니다
0
88
2
질문있습니다
0
143
2
아 이거 소스코드 같은거 없나요?
0
142
3
질문 드립니다. string.IsNullOrEmpty(name)
0
87
2
@Managers 가 씬에 배치되어 있어도 문제가 되지 않나요?
0
136
2
유니티6 NavMesh 안되는분들
1
176
1
Unity6 Unity-Chan Material 마젠타 문제 해결법
7
527
1
GetComponent<Poolable> 질문드립니다.
0
102
2
UI 불러오지 못함
0
118
2
UI 자동화 #1 - Util.cs의 FindChild함수에서 component.name에 컴포넌트 이름이 뜹니다.
0
155
2

