using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CharMove : MonoBehaviour
{ // 상시적인 움직임의 반응하여 움직이는 캐릭터 모션
private BoxCollider2D BoxCollider;
public LayerMask layerMask;
Animator animator;
RaycastHit2D hit;//충돌 확인용.
public int speed;//정할수 있는 일반 속도.
private int runspeed;//달리는 속도 사용.
public int powerspeed;//정할수 있는 달리기 속도.
Vector2 start;//캐릭터 위치
Vector2 end;//가야하는 다음 장소 위치
private void Start()
{
BoxCollider = GetComponent<BoxCollider2D>();
animator = GetComponent<Animator>();
}
void Update()//상시적으로 반응.
{
start = transform.position;
BoxCollider.enabled = false;//자신의 박스콜라이더에 걸리지않도록 꺼주기.
hit = Physics2D.Linecast(start, end, layerMask);//충돌 확인.
BoxCollider.enabled = true;//다시 켜주기.
if (hit.transform != null)//충돌이 있을 시.
{
end = start;//스타트로 초기화하여 충돌이 없도록 만들기.
}
else {
if (Input.GetKey(KeyCode.LeftShift))//달리기 속도 넣어주기.
runspeed = powerspeed;//달리기 속도 더해주기위한 값 적용.
else
runspeed = 0;//달리기 속도를 0으로 적용.
if (Input.GetKey(KeyCode.W)) //time.deltatime 초당 움직임을 만들기 위한 방법. 1초당 60프레임 업데이트 시 프레임마다 돌아가기때문에. 조절안됨.
{
end = start + new Vector2(0, speed + runspeed) *Time.deltaTime;//현재 위치에 새로운 벡터로 이동한 값을 더하여 다음 위치 선정.
this.transform.Translate(new Vector3(0, speed+runspeed, 0) * Time.deltaTime);
}
if (Input.GetKey(KeyCode.S))
{
end = start + new Vector2(0, -speed - runspeed) * Time.deltaTime;
this.transform.Translate(new Vector3(0, -speed - runspeed, 0) * Time.deltaTime);
}
if (Input.GetKey(KeyCode.D))
{
end = start + new Vector2(speed + runspeed, 0) * Time.deltaTime;
this.transform.Translate(new Vector3(speed + runspeed, 0, 0) * Time.deltaTime);
}
if (Input.GetKey(KeyCode.A))
{
end = start + new Vector2(-speed - runspeed, 0) * Time.deltaTime;
this.transform.Translate(new Vector3(-speed - runspeed, 0, 0) * Time.deltaTime);
}
}
}
}
else문에 있는걸 위로 끄집어 내고 translate 전부 지운다음에 그 뒤에 충돌검사 한다음에 만일 충돌한다면 움직이지 않는 방향으로 해보셈 지금 충돌검사가 start = end일꺼다. 디버깅 함 해보고 이유는 end값을 사전검사를 안해두고 이동후에 전프레임의 end로 계산할텐데 그걸 현프레임에서 start로 불러오면 당근 start = end가 되지
그리고 translate지울때 만일 충돌후 움직일때 대입에 고민된다면 임시벡터같은걸로 저장해두고 후에 계산해라 예를 들어 this.transform.franslate(new Vector3(~)) -> Vector3 temp = new Vector3(~) ... this.tranform.Translate(temp) 요런식으로