유니티

[3D MINI Project] 플레이어 이동 코드 작성, 넘어짐 수정

수다밀다_sudamilda 2022. 11. 5. 16:58
728x90

[3D MINI Project] 3D 미니 프로젝트 기획

 

[3D MINI Project] 3D 미니 프로젝트 기획

레벨 디자인 할라고 일단 만들어 본 맵 일단 1지역에만 배치해서 만들 예정 몬스터마다 움직임이 다르겠지만 미니 프로젝트에서는 우선 FPS와 비슷하게 몬스터가 캐릭터를 향해 불을 쏘고 캐릭

sudamilda.tistory.com

 

하려고 했는데

 

 

아 개답답해!!!!!!!!!!!!!!!

 

그냥 놔둬봤더니 또 되더라...ㅎㅎ...

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player_Controller : MonoBehaviour
{
    Rigidbody playerRigidbody;
    public float speed = 8f;

    // Start is called before the first frame update
    void Start()
    {
        playerRigidbody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        //if(Input.GetKey(KeyCode.UpArrow)==true)
        //{
        //    playerRigidbody.AddForce(0f, 0f, speed);
        //}

        //if (Input.GetKey(KeyCode.DownArrow) == true)
        //{
        //    playerRigidbody.AddForce(0f, 0f, -speed);
        //}

        //if (Input.GetKey(KeyCode.RightArrow) == true)
        //{
        //    playerRigidbody.AddForce(speed, 0f,0f);
        //}

        //if (Input.GetKey(KeyCode.LeftArrow) == true)
        //{
        //    playerRigidbody.AddForce(-speed, 0f, 0f);
        //}

        // 수평과 수직축 입력값을 감지 및 저장
        float xInput = Input.GetAxis("Horizontal");
        float zInput = Input.GetAxis("Vertical");


        // 실제 이동 속도를 입력값과 이동 속력을 통해 결정
        float xSpeed = xInput * speed;
        float zSpeed = zInput * speed;

        // Vec3 속도로 생성
        Vector3 newVelocity = new Vector3(xSpeed, 0, zSpeed);

        // RigidBody에 할당
        playerRigidbody.velocity = newVelocity;
    }

    public void Die()
    {
        gameObject.SetActive(false); // 죽으면 비활성화

        GameMAnager gameManager = FindObjectOfType<GameMAnager>();

        gameManager.EndGame();
    }
}

 

어쨌든 이건 기존 게임 코드인데

 

뜯어서 살펴보면

 

먼저 주석 처리된 것은 유니티에 있는 거를

사용하지 않고 플레이어를 움직이는 코드

 

Input.GetAxis("") 안에

Horizontal, Vertical을 넣으면

유니티에서 알아서 인지하고 움직일 수 있다. 

 

    void Update()
    {
        // 수평과 수직축 입력값을 감지 및 저장
        float xInput = Input.GetAxis("Horizontal");
        float zInput = Input.GetAxis("Vertical");
    }

 

일단 Update() 문 안에 이 친구를 넣어줬다.

 

아 안움직이지

바본가

Rigidbody 안 함ㅋㅋㅋㅋㅋㅋㅋㅋ

 

 

아 이제 넣어줌 ㅎㅎ

 

코드에도 Rigidbody를 넣어주고

설정을 해줘야겠다.

 

 

예...

움직이네......

 

이렇게 제멋대로 눕고 난리 칠 때는

Freeze를 건드려볼 필요가 있다.

 

 

엉엉...

 

뇌 없이 클릭해봤더니

드러누웠다.

 

필자는 수학 전공자

sin cos tan를 활용하여

이 친구의 움직임을 판단해보자.

물론 개소리다.

 

 

Rotation이 그 축 기준 회전이구나

ㅅㅂ;;;

그걸 이제 알다니...

뭐 어쨌든

원하는 대로 돌아가고 움직이기 성공

 

스피드를 바꿨는데도

Inspector창은 그대로라서

당황했다.

 

Inspector에서 speed를 수정해서

답답함을 날려줌.

 

일단 풀코드

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player_Controller_3D : MonoBehaviour
{
    Rigidbody playerRigidbody;
    public float speed = 30f;

    // Start is called before the first frame update
    void Start()
    {
        playerRigidbody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        // 수평과 수직축 입력값을 감지 및 저장
        float xInput = Input.GetAxis("Horizontal");
        float zInput = Input.GetAxis("Vertical");

        // 실제 이동 속도를 입력값과 이동 속력을 통해 결정
        float xSpeed = xInput * speed;
        float zSpeed = zInput * speed;

        // Vec3 속도로 생성
        Vector3 newVelocity = new Vector3(xSpeed, 0, zSpeed);

        // RigidBody에 할당
        playerRigidbody.velocity = newVelocity;
    }
}
728x90