Unity—1 인칭 전체 컨트롤러 (홈 메이드 버전)

Unity 1 인칭 제어 스크립트

1. 일반적인 아이디어 :

(1) 모바일 기능으로.
(2) 카메라가 따라옵니다.
(3) 마우스의 움직임으로 시야각을 조절할 수 있습니다.

2. 특정 구현 방법 :

(1) 모바일 기능 스크립트 :

여기서는 강체 구성 요소의 addforce를 사용하여 이동하는 힘을 적용하려고합니다. 특정 코드는 다음과 같습니다. 참고 : (ismoving은이 함수에서 쓸모가 없습니다. 주로 다른 함수에 대해서는이 bool 값을 무시하십시오. )

    private bool isMoving;
    private Rigidbody PlayerRig;
    public float Speed=2;
    void Start()
    {
    
    
        PlayerRig = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
    
    
        PlayerMove();
    }
 void PlayerMove()
    {
    
    
        isMoving = false;
        SpeedControl();
        if (Input.GetKey(KeyCode.W))    //ahead
        {
    
    
            PlayerRig.AddForce(new Vector3(0, 0, 1)*Time.deltaTime*Speed*200);
            isMoving = true;
        }
         else
        if (Input.GetKey(KeyCode.S))    //right
        {
    
    
            PlayerRig.AddForce(new Vector3(0, 0, -1) * Time.deltaTime * Speed * 200);
            isMoving = true;
        }
        else
        if (Input.GetKey(KeyCode.A))    //left
        {
    
    
            PlayerRig.AddForce(new Vector3(-1, 0, 0) * Time.deltaTime * Speed * 200);
            isMoving = true;
        }
        else
        if (Input.GetKey(KeyCode.D))    //back
        {
    
    
            PlayerRig.AddForce(new Vector3(1, 0, 0) * Time.deltaTime * Speed * 200);
            isMoving = true;
        }
        else
          if (Input.GetKey(KeyCode.Space))  //jump
        {
    
    
            PlayerRig.AddForce(new Vector3(0, 1, 0) * Time.deltaTime * Speed * 300);
            isMoving = true;
        }
       
    }

위의 코드를 분석 해보면 리지드 바디 컴포넌트가 플레이어 오브젝트에 매달릴 필요가 있음을 알 수 있습니다. 리드 바디 컴포넌트도 코드에서 선언하고 얻어야합니다.이를 기반으로 리지드 바디 .AddForce (Vector3))를 사용하여 힘을 적용 할 수 있습니다. AddForce 뒤에 Time.delttime이 추가되는데, 이는 힘 적용 함수가 프레임없이 호출되기 때문이며, 이는 힘이 초당 60 회 적용된다는 것을 의미합니다! (직접 현장 방출 = v =) 및 deltatime = 1 / 60 즉, 프레임의 횟수입니다.이 곱셈은 1 초에 한 번 힘이 가해지는 것을 의미하고 곱셈 후의 상수가 조정에 역할을합니다. 힘이 작다고 느끼면 더 큰 숫자로 곱하거나 강체 구성 요소를 곱할 수 있습니다. 저항 값은 더 작은 값으로 변경할 수 있습니다 *
(2) 다음 카메라
는 벡터 덧셈 문제가 몇 가지 있습니다. 공간 벡터는 그리기가 쉽지 않기 때문에 간단한 평면 직각 좌표를 사용하여이 문제를 설명 할 수 있습니다. 먼저 특정 코드를 살펴 보겠습니다. :

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

public class FollowTarget : MonoBehaviour
{
    
    
    public Transform PlayerTransform;
    private Vector3 offset;//最开始的偏移量


    // Start is called before the first frame update
    void Start()
    {
    
    
        offset = transform.position - PlayerTransform.position;
    }

    // Update is called once per frame
    void Update()
    {
    
    
        transform.position = PlayerTransform.position + offset;
    }
}

오프셋은 오프셋입니다. 예를 들어 공간에는 A (1,2), B (2,1) 및 2 개의 점이 있습니다. 벡터 AB는 A에 상대적인 B의 오프셋입니다. 즉, B 지점을 점 A와 B의 좌표는 (2,1)에서 (1,2)로 변경해야합니다. AB 벡터는 AB = (-1,1), B + AB = (2,1) + (-1,1) =입니다. (1,2) = A, 이제 분명합니까? 카메라가 어떻게 움직여도 조작 된 물체를 기준으로 유지하려면, 즉 상대적으로 고정 된 상태를 유지하기 위해 언제든지 두 개의 위치를 ​​조정하려면 transform.position을 통해 카메라 위치를 수정하고이 스크립트를 카메라에 걸어 두세요 ~
(3) 예 마우스의 움직임으로 시야각을 제어합니다.
여전히 먼저 코딩

    void AngleControl()
    {
    
    
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        float X = Input.GetAxis("Mouse X") * RotateSpeed;
        float Y = Input.GetAxis("Mouse Y") * RotateSpeed;
        Vector3 speed = new Vector3(h, 0, v);
        Maincameral.transform.localRotation = Maincameral.transform.localRotation * Quaternion.Euler(-Y,0,0);
        transform.localRotation = transform.localRotation * Quaternion.Euler(0, X, 0);
    }

기본 기능이 실현 되더라도 효과 그림을 넣으십시오.여기에 사진 설명 삽입

다른 요소는 무시할 수 있습니다 ^ v ^ 전반적인 구현은 쿼터니언을 사용해야하는 이유입니다. 각도를 설정하기 위해 회전을 수정하는 대신 오일러는 범용 잠금 잠금 문제를 수반하여 옆으로 보이게합니다. 전체 원근 왜곡의 결과는 다음 호에서 논의 될 것입니다. 안녕 ~

추천

출처blog.csdn.net/Virgile_J/article/details/108721018