Unity角色或摄像机移动和旋转的控制脚本

该脚本挂载到需要被移动、旋转控制的物体身上,也可以之间挂在到摄像机上!

挂载到摄像机上可以实现第一人称视角控制!

挂载到物体身上,配合摄像机跟踪脚本可以实现,第三人称视角控制! 

第一人称视角

将角色控制脚本挂给摄像机即可!

以下是角色控制脚本:

// 导入Unity的命名空间,以便我们可以使用Unity的类和方法
using System.Collections;

// 导入Unity的Generic Collections命名空间,以便我们可以使用Generic Collections类和方法
using System.Collections.Generic;

// 导入UnityEngine命名空间,这个命名空间包含了很多Unity的类和方法
using UnityEngine;

// 定义一个名为RotateControl的公共类,这个类继承自MonoBehaviour类
// MonoBehaviour类是Unity中的基础类,用于让游戏对象和其他组件进行交互
public class RotateControl : MonoBehaviour
{
    // 这个注释是对该脚本作用的简单描述
    // 这个脚本来通过鼠标左右滑动和上下滑动控制摄像机或者主角进行选择
    /*  
     * 下面的注释是对整个流程的描述,包括检测用户是否有滑动鼠标以及滑动后如何旋转的说明
     */
    // 定义一个浮点型变量RotionXX,这个变量用于存储旋转角度(在X轴上)
    float RotionXX;

    // 定义一个浮点型变量RotionYY,这个变量用于存储旋转角度(在Y轴上)
    float RotionYY;

    // 定义一个公共浮点型变量roatespeed,这个变量用于控制旋转的速度,默认值为10
    public float roatespeed = 10f;

    // Update方法在Unity中是每个帧都会调用的方法,类似于C++中的每帧都会执行一次的函数
    void Update()
    {
        // Input.GetAxis("Mouse X")获取鼠标在X轴上的移动量,这个值是-1(左),0(无移动)或1(右)
        float RotionY = Input.GetAxis("Mouse X");

        // Input.GetAxis("Mouse Y")获取鼠标在Y轴上的移动量,这个值是-1(上),0(无移动)或1(下)
        float RotionX = Input.GetAxis("Mouse Y");

        // 下面的代码是计算旋转角度并存储到RotionXX和RotionYY中
        // Time.deltaTime获取上一帧和当前帧之间的时间差,乘以roatespeed可以得到每帧旋转的角度
        // 因为每帧的时间可能不同,使用Time.deltaTime可以保证在不同帧率下旋转的速度是一致的
        //四元数
        RotionXX += -RotionX * Time.deltaTime * roatespeed;
        RotionYY += RotionY * Time.deltaTime * roatespeed;

        // 这行代码将RotionXX的值限制在-45和45之间,超过这个范围的数值会被调整到这个范围之内
        RotionXX = Mathf.Clamp(RotionXX, -45f, 45f);

        // 打印出当前的旋转角度RotionXX的值,帮助我们调试程序
        Debug.Log("角度" + RotionXX);

        // 这行代码将计算出来的旋转角度应用到对象的transform上,实现旋转效果
        this.transform.rotation = Quaternion.Euler(RotionXX, RotionYY, 0);
    }
}

第三人称

将上面, 角色控制脚本挂给模型,并添加一个摄像机追踪空物体,便于摄像机有一个追踪目标,然后把下面脚本挂给摄像机

附赠摄像机跟踪脚本(如果你角色控制脚本给了摄像机,那么这个脚本就不需要了)

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

public class CameraFollow : MonoBehaviour
{
    public Transform target; // 跟踪目标
    public float smoothTime = 0.3f; // 平滑时间

    private Vector3 velocity = Vector3.zero;

    void Update()
    {
        计算新的位置
        Vector3 targetPosition = target.TransformPoint(new Vector3(0,1,-5));//本地坐标转世界坐标
        平滑移动到新的位置
        transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);
        transform.LookAt(target);
    }
}

猜你喜欢

转载自blog.csdn.net/leoysq/article/details/133828409