Unity 초보자 1 - 캐릭터 이동 제어(2d)

이 글은 chutianbo 선생님의 노트에서 옮긴 글입니다 Link to station b
.통일된 캐릭터 이동은 일반적으로 제어 캐릭터의 트랜지션 속성에서 위치를 기준으로 좌표축을 사용하는데, 일반적으로 이진 선형 방정식의 xy축입니다.

가장 쉬운 움직임

public class RubyController : MonoBehaviour
{
    // 每帧调用一次 Update
    // 让游戏对象每帧右移 0.1
    void Update()
    {
        // 创建一个 Vector2 对象 position,用来获取当前对象的位置
        Vector2 position = transform.position;
        // 更改 position 的 x 坐标值,让其 加上 0.05
        position.x = position.x + 0.05f;
        // 更新当前对象的位置到新位置
        transform.position = position;
    }
}

그런 다음 모든 프레임에서 우리 캐릭터는 x의 양의 축으로 0.05 거리를 이동합니다(프레임 수가 많을수록 이동 속도가 빠름).

제어와 함께 이동

public class RubyController : MonoBehaviour
{
   // 每帧调用一次 Update
    // 让游戏对象每帧右移 0.1
    void Update()
    {
        // 获取水平输入,按向左,会获得 -1.0 f ; 按向右,会获得 1.0 f
        float horizontal = Input.GetAxis("Horizontal");
        // 获取垂直输入,按向下,会获得 -1.0 f ; 按向上,会获得 1.0 f
        float vertical = Input.GetAxis("Vertical");

        // 获取对象当前位置
        Vector2 position = transform.position;
        // 更改位置
        position.x = position.x + 0.1f * horizontal;
        position.y = position.y + 0.1f * vertical;
        // 新位置给游戏对象
        transform.position = position;
    }
}

이것은 wasd 및 화살표 키에 직접 해당하는 기본 수직 키 및 수평 케이스를 가져옴으로써 이동하기 위해 Unity와 함께 제공되는 구성 요소를 사용하는 것으로 보입니다.

움직임을 제어하는 ​​두 번째 방법

public class RubyController : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
    
        Vector2 position = transform.position;

        if (Input.GetKey("w"))
        {
            position.y = position.y + 0.05f;
        }else if (Input.GetKey("a"))
        {
            position.x = position.x - 0.05f;
        }else if (Input.GetKey("s"))
        {
            position.y = position.y - 0.05f;
        }
        else if(Input.GetKey("d")){
            position.x = position.x +0.05f;
        }

        
       
        transform.position = position;
    }
}

getkey를 사용하여 제어 방법을 사용자 정의하십시오.

그러나 첫 번째와 두 번째에서 사용되는 GetKey와 GetAxis 메서드의 차이점은 바로 그것입니다. GetKey에는 0과 1의 차이만 있으며 0.5 또는 0.05는 없습니다. 그러나 getAxis는 부드러운 곡선입니다(모바일 컨트롤에 권장됨).

업데이트를 직접 사용하여 이동하는 단점

업데이트 호출은 게임 프레임 수, 즉 프레임당 하나의 업데이트가 호출되기 때문에 프레임 수가 높을수록 캐릭터가 더 빨리 움직입니다
. 0.1*30인 초는 3단위입니다. 60프레임이면 1초는 6단위입니다.

프레임 수가 이동 속도에 영향을 미치는 문제를 해결하는 방법 1: 프레임 잠금

  void Start()
    {
    //开垂直同步//
        QualitySettings.vSyncCount = 0;
        //帧率设置为50//
        Application.targetFrameRate = 50;
    }

하지만 프레임을 잠그면 게임 사진의 품질이 떨어지므로 Ruby의 동작을 제어하기 위해 초 단위를 사용합니다.

임시 최종 솔루션

public class RubyController : MonoBehaviour
{
 public float speed = 0.1f;
 // Start is called before the first frame update
 void Start()
 {

 }

 // Update is called once per frame
 void Update()
 {
     float horizontal = Input.GetAxis("Horizontal");
     float vertical = Input.GetAxis("Vertical");
     Vector2 position = transform.position;
     position.x = position.x + speed * horizontal * Time.deltaTime;
     position.y = position.y + speed * vertical * Time.deltaTime;
     transform.position = position;
 }
}

이런 식으로 우리는 속도가 5일 때 프레임 제어를 사용할 때 원래 속도 0.1을 얻을 수 있음을 알 수 있습니다.

충돌시 버그 해결

위의 마지막 코드에 따라 이동을 제어하면 두 개의 강체가 충돌할 때 캐릭터가 유령처럼 나타납니다. 그래서 여기에서 풀기 위해 객체의 강체 구성 요소를 도입해야 합니다.

void Start()
 {
     //获得当前游戏对象的刚体组件
     rigidbody2d = GetComponent<Rigidbody2D>();


 }
   void Update()
 {
    horizontal = Input.GetAxis("Horizontal");
    vertical = Input.GetAxis("Vertical");

 }
 //固定时间间隔刷新方法
 private void FixedUpdate()
 {
    
     Vector2 position = transform.position;
     position.x = position.x + speed * horizontal * Time.deltaTime;
     position.y = position.y + speed * vertical * Time.deltaTime;
     rigidbody2d.position = position;
 }

여기에서 획득 이동을 업데이트에 넣어야 합니다. 한 번에 한 프레임씩 호출되기 때문에 더 매끄럽고 FixedUpdate를 호출하는 데 약 20ms가 걸립니다.

글쎄요, 일반 버그 시간은
물리 시스템을 사용하여 위의 이동 세트 이후입니다. 나중에 적의 이동을 추가한 후 다른 강력한 개체와 충돌한 후 주인공도 다른 개체의 이동 방향으로 힘을 얻습니다.( 내려가는 로봇에 대해 주인공은 로봇 아래에서 충돌하고 주인공은 다른 충돌체와 충돌할 때까지 아래로 내려갑니다)
답변에 따르면 강체 이동은 위치 할당을 직접 사용할 수 없으므로
rigidbody2d.position = position; 이 문장은 rigidbody2d.MovePosition(position)으로 변경해야 합니다.

이 문서는 Unity의 개인 초기 학습만을 위한 것입니다.
링크: Ruby's Adventure: 2D Beginner
링크: 수직 동기화란 무엇입니까?
링크: Time.deltaTime의 공식 문서

추천

출처blog.csdn.net/jijikok/article/details/125732414