통일 된 2D 캐릭터 컨트롤러 (구식 플랫 포머를 되 찾으려고 시도)


11

요즘 나는 유니티가있는 2D 캐릭터 컨트롤러를 만들려고합니다 (물리학 사용). 나는 물리 엔진에 익숙하지 않아서 내가 원하는 컨트롤 느낌을 얻는 것이 정말 어렵습니다. 내가 찾은 문제에 대한 해결책을 제안 할 수 있다면 정말 기쁠 것입니다.

이것은 지금 내 고정 업데이트입니다.

public void FixedUpdate()
{
    Vector3 v=new Vector3(0,-10000*Time.fixedDeltaTime,0);
    _body.AddForce(v);

    v.y=0;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.velocity=v;

    Debug.Log("Velocity: "+_body.velocity);
}

여기에 중력과 선형 힘을 왼쪽과 오른쪽으로 적용하여 강체를 움직이려고합니다. 나는 움직일 때 튀지 않고 마찰이없고 정지 상태에서 1 마찰이 발생하는 물리 재질을 설정했습니다. 주요 문제는 경사가있는 충돌체가 있고 속도가 올라가고 (느리게) 기울기가 내려 가고 (빠르게) 직선 충돌체를 걷는 것입니다 (정상). 이 문제를 어떻게 해결할 수 있습니까? 보시다시피 x 축에 대해 항상 같은 속도를 적용하고 있습니다.

플레이어의 경우, 내가 적용하는 강체 인 발 위치에 구를 설정했습니다.

이것으로 내 인생을 더 쉽게 만들 수있는 다른 팁은 환영합니다 :).

PD 집에 돌아 오는 동안 나는 플레이어가 걷고있는 표면에 일정한 힘을 가하여이 문제를 해결할 수 있음을 알았지 만 그것이 최선의 방법인지는 모른다.


4
구식 플랫 포머는 손으로 조율 된 "만화 물리학"을 사용하여 걷기 동작을위한 역학 및 직접 속도 제어 (즉, 물리학 없음)를 사용했습니다. 캐릭터 컨트롤러를 다시 쓸 수 있다면, 구식 게임이 가지고 있던 선명한 움직임을 찌그러 뜨리고 물리 시뮬레이션을하기가 어렵 기 때문에 그렇게하십시오.
Patrick Hughes

사용자 정의 작성의 문제는 충돌 감지가 손실된다는 것입니다. 그리고 환경에 따라 레이 캐스트를 사용하지 않고 재 구축하기가 쉽지 않습니다 (환경 등에 따라 다름). 이 상황을 어떻게 처리합니까?
노바 드

운동 학적 강체를 사용할 때 여전히 커스텀 애니메이션 인 것에 충돌체를 가질 수 있습니다. 나는 대부분의 상황에서 이러한 종류의 응용을 위해 실제 물리 / 힘 등을 원하지 않는다는 것을 보증합니다. 좀 더 기술적 인 각도를
원한다면

1
이 상황에서 도랑 물리를 정의하십시오.
Ray_Garner

답변:


7

당신이 구식 플랫 포머를 모방하려는 경우 하나는 물리학을 완전히 버리는 것입니다. 당신은 물리학 시스템과 싸우면서 결국 구식 플랫 포머의 결정적인 비현실적인 움직임을 얻습니다. 이 CharacterController 대체물을 살펴보면 물리학을 완전히 분리하여 한 가지 방법으로 구현할 수있는 좋은 아이디어를 얻을 수 있습니다.


3

당신은 아마도 mheona가 추천 한 것에 더 만족할 것입니다. 그러나 Unity의 물리학을 사용하려면을 사용하고 싶을 것입니다 ForceMode.VelocityChange.

예:

public void FixedUpdate()
{
    var v = Vector3.zero;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.AddForce(v, ForceMode.VelocityChange);

    Debug.Log("Velocity: "+_body.velocity);
}

또한 프로젝트의 물리 설정에서 전체 중력을 적용하고 더 빨리 떨어지려는 객체에 대해 Constant Force 구성 요소를 추가하십시오 .

ForceMode.Impulse비슷하지만 rigidbody의 질량에 영향을받습니다. 튜닝하기가 어렵습니다.


2

내장 캐릭터 컨트롤러 컴포넌트를 싫어하더라도 ( 2D 게임 플레이 튜토리얼에 대한 Unity의 예제 코드를 살펴보십시오 .)

이 코드는 캐릭터 컨트롤러를 사용하여 움직이는 플랫폼, 적 및 상자가 충돌하는 완전한 2D 게임 플레이를 구현합니다.

그러나 살펴보기를 원하지 않는다면 물리 사용을 최소화하고 자신의 코드로 동작을 복사하는 것이 좋습니다. 어떤 종류의 2D 게임을 계획 하느냐에 따라 꽤 잘 작동 할 수 있습니다. 예를 들어 Rigidbody.velocity캐릭터를 강제로 움직이지 않고 축을 기준으로 Transform.Translate()객체를 이동시키는으로 직접 엉망이 될 수 있습니다 Transform.position. 객체 자체 또는 플랫폼 또는 바닥 forwardback관련 이 있는지 여부를 결정할 수 Transform.up있으므로 경사로와 종류가 각도를 알고 있는지 알 수 있습니다.

또한 어떤 종류의 속도 제어 속성 (예 : 키를 누르는 시간)을 만들면 캐릭터가 약간의 속도없이 너무 많이 기울어 진 것을 걷는 것을 방지하기 위해 번역하는 동안 방향과 함께 적용 할 수 있습니다. 소닉 더 헤지혹 (Sonic the Hedgehog) 창세기 / 메가 드라이브

당신이 물리학을 계속 사용하기로 선택한다면 나는 그것을 잘하지 못하기 때문에 전혀 당신을 도울 수 없지만 몸이 계속 유지하기 위해 더 많은 힘이 필요하기 때문에 '기울기'를 느리게하는 것이 정상적인 행동이라는 것을 알고 있습니다. 실생활처럼.


내가 화합 할 때 읽은 첫 번째 것은 그 튜토리얼이었습니다. 문제는 컨트롤 느낌이 꽤 나쁘다는 것입니다. 이것이 내 솔루션을 찾고 싶었던 이유입니다. 반면에 Transform.Translate () 사용을 시작하면 경사 및 기타 작업을 수행하는 것이 쉽지 않습니다. 여러 번 레이 캐스팅해야합니다 (바닥의 경우 2 또는 3, 영웅의 크기에 따라 움직이는 방향에 대해 더 많음). 모바일 장치의 경우 레이 캐스트가 좋지 않으며 충돌 감지 반복마다 5..n을 수행해야하는 경우에는 적습니다. 아마도 내가 틀렸을 수도 있지만 그렇게 생각하지는 않습니다.
Notbad

1

당신이 원하는 것은 내장 문자 컨트롤러 입니다. step offset이 컴포넌트 에서 속성을 설정하면 플레이어가 경사를 쉽게 오르 내릴 수 있습니다.


나는 knw에 문자 컨트롤러가 있고 그것을 여러 번 사용했다는 것을 언급하지 않아서 유감이지만 동작 방식이 마음에 들지 않습니다. 모션 역학이 가장 중요한 것 중 하나 인 플랫폼 게임이 아닌 FPS에만 더 적합합니다.
Notbad

캐릭터 컨트롤러의 설정으로 바이올린을 피우면 잘 작동한다고 생각합니다. 당신은 무엇을 부족한 것으로 나타 났습니까?
NoobsArePeople2

내가 싫어하는 첫 번째는 레이 캐스트가있는 일반적인 강체에 비해 느리다는 것입니다. 그것을 달성하는 방법을 알면 더 가벼운 컨트롤러를 사용할 수 있다고 생각합니다. 또 다른 문제는 플랫폼 가장자리에서 캡슐 / 스피어 홀수 거동이라는 것입니다 (레이 캐스팅으로 더 해결할 수 있음). 이것이 내 자신의 롤을 원하는 이유입니다.
Notbad

0

여기에 이미지 설명을 입력하십시오힘이 플랫폼과 평행하지 않기 때문에 결과가 점점 낮아지고 하강하는 것으로 가정합니다.

좌표계에 상대적인 힘을 가하면

AddRelativeForce

최대 속도를 "x"로 유지하고 스칼라와 비교하려면 속도가 벡터이며 평면 지형 vy가 0 인 vx와 vy를 작성한다는 점을 기억해야하지만 경사면에서는 반드시 0보다 큽니다.

몸의 방향에 따라 속도가 변하고 상대적인 vx는 전반적인 vx에 따라 변합니다.

이렇게하면 원하지 않는 방식으로 V를 수정할 수 있습니다.

if (Mathf.Abs (v.x)> _ maxWalkSpeed) v.x = _maxWalkSpeed;

동일한 글로벌 Vx를 유지하는 것은 눈에 이상하게 보일 수 있습니다. (원치 않는 가속)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.