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