Unity—第一人称完整控制器(自制版)

unity第一人称控制脚本

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;
        }
       
    }

分析下上述代码可知需要在玩家物体上挂在刚体组件,在代码中也应当声明并获取rigidbody组件,在此基础上我们才可以使用rigidbody.AddForce(Vector3))来施加力,通过观察可以看到在AddForce后*了一个Time.delttime这是因为在没帧都会调用施加力这个函数,也就意味着这个力一秒施加力60次!(直接原地发射=v=)而deltatime=1/60也就是一帧的时间数这样一乘就意味着一秒施加一次力,而后面乘的常数量则起到调节作用,你感觉力小了可以乘一个较大的数乘起来或者将刚体组件的阻力值改小些都可以的 *
(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;
    }
}

offset是一个偏移量比方说空间有A(1,2),B(2,1),2个点,向量AB就是B相对于A的一个偏移量,意思是要想将B点移动到A点既B的坐标要从(2,1)变到(1,2),AB向量为A-B=(-1,1),B+AB=(2,1)+(-1,1)=(1,2)=A,这下是不是就明白了呢?要让摄像头无论怎么移动都和操控物体保持相对位置也就是随时调整二者位置使其保持相对静止,通过transform.position修改camera位置即可,要把这个脚本挂在Camera上欧~
(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 ^总体是实现了,对于为什么一定要用quaternion.Euler而不是通过修改他的rotation来设置角度则涉及到一个万向锁锁死问题,具体会导致像是侧着身子看整个视角歪曲的结果下期再讨论。bye~

猜你喜欢

转载自blog.csdn.net/Virgile_J/article/details/108721018