摄像机位置自己看着摆放

Camera 跟随player

MainCameraModeilocationRecord 是空物体放在MaiCamera 同一位置

head 是头部放在你认为的第一人称视角的地方

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 玩家控制器 
/// </summary>
public class PlayerController : MonoBehaviour
{
    [Header("切换第一人称")]
    [Tooltip("切换第一人称时为true")]
    public bool FirstPersonExchange = false;
    [Tooltip("记录摄像机第三人称的位置")]
    public Transform MainCameraModelLocationRecord;
    [Tooltip("第一人称摄像机的位置")]
    public Transform Head;

[Header("玩家的移动和旋转参数")]
    [Tooltip("走路速度")]
    public float WalkingSpeed = 3;
    [Tooltip("跑步速度")]
    public float RunningSpeed = 5;

[Header("玩家的自身旋转和位置")]
    [Tooltip("玩家自身旋转速度")]
    public float PlayerRotationSpeed = 10;
    [Tooltip("人物位置")]
    public Transform PlayerModelsTransform;
    [Tooltip("位置输入")]
    private Vector3 _moveDirection = Vector3.zero;

[Header("重力和跳跃的参数")]
    [Tooltip("是否接地")]
    public bool GroundCheck ;
    [Tooltip("重力")]
    public float Gravity = -15f;
    [Tooltip("跳跃的力")]
    public float JunpHeiqht = 5;

[Header("相机的旋转参数")]
    [Tooltip("相机旋转速度")]
    public float CameraRotationSpeed = 2;
    [Tooltip("第三人称向上下看的范围")]
    public float CameraRotationX = 30;
    [Tooltip("第一人称向上下看的范围")]
    public float FirstPersonCameraRotationX = 45;

[Header("相机的位置信息")]
    [Tooltip("相机的父物体")]
    public GameObject CameraFather;
    [Tooltip("相机的模型")]
    public GameObject MainCameraModel;

[Header("相机视野大小")]
    [Tooltip("视野最大值")]
    public float MaxFieldOfView = 100;
    [Tooltip("视野最小值")]
    public float MinFieldOfView = 10;

[Tooltip("判断是否按下键盘按键")]
    private bool _isKeyboard = false;

[Tooltip("穿模物体储存")]
    private    List<MeshRenderer> _mesList = new List<MeshRenderer>();
    [Tooltip("是否开启第三人称")]
    private bool _isViewingAngleSwitching = false;
    [Tooltip("不跳跃时Y的值")]
    private float _Dontjump = 0;
    [Tooltip("角色控制器")]
    private CharacterController _characterController;
    void Start()
    {
        _characterController = transform.GetComponent<CharacterController>();

}

void Update()
    {
        Move();
        CameraRotation();
        Zoom();
        if (!FirstPersonExchange)
            CameraOcclusion();
    }
    /// <summary>
    /// 相机不穿模
    /// </summary>
    private void CameraOcclusion()
    {

Vector3 CameraPointing = transform.position - MainCameraModel.transform.position;//相机到人物的向量
        Ray CameraRay = new Ray(MainCameraModel.transform.position, CameraPointing);
        RaycastHit hitInfo;
        if (Physics.Raycast(CameraRay, out hitInfo))
        {

if (hitInfo.collider.tag != "Player")
            {
                _mesList.Add(hitInfo.collider.gameObject.GetComponent<MeshRenderer>());
                hitInfo.collider.gameObject.GetComponent<MeshRenderer>().enabled = false;

}
            else
            {
                foreach (var item in _mesList)
                {
                    item.enabled = true;
                }
                _mesList.Clear();
            }

}

}

/// <summary>
    /// 运动
    /// </summary>
    private void Move()
    {

WalkingSpeed = Input.GetKey(KeyCode.LeftShift) ? RunningSpeed : 2.0f;//加速
        if (GroundCheck)//跳跃
        { 
            _Dontjump = Input.GetKeyDown(KeyCode.Space) ? JunpHeiqht : _Dontjump;
            GroundCheck = false;
        }
        if (_characterController.isGrounded)
        {
            GroundCheck = true;
        }
        float _hprizontal = Input.GetAxis("Horizontal");
        float _vertical = Input.GetAxis("Vertical");

_moveDirection = new Vector3(_hprizontal * WalkingSpeed, _Dontjump, _vertical * WalkingSpeed);
        _moveDirection = transform.TransformDirection(_moveDirection);

_Dontjump += Gravity * Time.deltaTime;//重力
        _characterController.Move(_moveDirection * Time.deltaTime);

Vector3 _movement = Vector3.zero;
        _movement = transform.forward * _vertical + transform.right * _hprizontal;
        _isKeyboard = _movement == Vector3.zero ? _isKeyboard : true;//判断是否有按键输入
        if (_isKeyboard && !FirstPersonExchange)//人物自身旋转
        {
            transform.rotation = Quaternion.Slerp(transform.rotation, CameraFather.transform.rotation, 0.15f);
            Quaternion PlayerModelsRotation = Quaternion.LookRotation(_movement);
            PlayerModelsTransform.rotation = Quaternion.Lerp(PlayerModelsTransform.rotation, PlayerModelsRotation, Time.deltaTime * PlayerRotationSpeed);
            _isKeyboard = false;
        }

if (FirstPersonExchange)//第一人称相机位置
        {
            transform.rotation = Quaternion.Slerp(transform.rotation, CameraFather.transform.rotation, 0.15f);
            PlayerModelsTransform.rotation = transform.rotation;
            MainCameraModel.transform.position = Head.position;
            _isViewingAngleSwitching = true;
        }

else if (_isViewingAngleSwitching)//第三人称相机位置
        {
            MainCameraModel.transform.position = MainCameraModelLocationRecord.position;
            MainCameraModel.transform.rotation = MainCameraModelLocationRecord.rotation;
            _isViewingAngleSwitching = false;
        }

}
    /// <summary>
    /// 相机旋转
    /// </summary>
    private void CameraRotation()
    {
        CameraRotationX = FirstPersonExchange ? FirstPersonCameraRotationX : 30;//第一和第三人称角度切换

CameraFather.transform.position = transform.position;//相机跟随
        if (Input.GetMouseButton(1))
        {
            float cameraX = Input.GetAxis("Mouse X");
            float cameraY = Input.GetAxis("Mouse Y");
            if (cameraX != 0)//相机x轴旋转
            {
                CameraFather.transform.Rotate(Vector3.up, cameraX * 120 * CameraRotationSpeed * Time.deltaTime);
                if (FirstPersonExchange)
                    transform.Rotate(Vector3.up, cameraX * 120 * CameraRotationSpeed * Time.deltaTime);
            }
            if (cameraY != 0)//相机Y轴旋转
            {
                MainCameraModel.transform.Rotate(Vector3.left, cameraY * 120 * CameraRotationSpeed * Time.deltaTime);
            }

if (Vector3.Angle(CameraFather.transform.forward, MainCameraModel.transform.forward) > CameraRotationX)//上下视角约束
            {
                MainCameraModel.transform.Rotate(Vector3.left, -cameraY * 120 * CameraRotationSpeed * Time.deltaTime);
            }

}

}
    /// <summary>
    /// 视距选择
    /// </summary>
    private void Zoom()
    {
        float camerazoom = Input.GetAxis("Mouse ScrollWheel");//鼠标滑轮
        if (camerazoom < 0)
        {
            if (Camera.main.fieldOfView <= MaxFieldOfView)
            {
                Camera.main.fieldOfView += 2;
            }
            if (Camera.main.orthographicSize <= 20)
            {
                Camera.main.orthographicSize += 0.5f;
            }
        }
        if (camerazoom > 0)
        {
            if (Camera.main.fieldOfView >= MinFieldOfView)
            {
                Camera.main.fieldOfView -= 2;
            }
            if (Camera.main.orthographicSize >= 5)
            {
                Camera.main.orthographicSize -= 0.5f;
            }
        }
    }
}

摄像机旋转,视距调节,第一/第三人称控制器可切换相关推荐

  1. 使用新的输入系统在 Unity 中构建第三人称控制器

    如果你随机挑选几款游戏,每款游戏可能会有不同的艺术风格和机制.不同的故事,甚至根本没有故事,但它们都有一个共同点:所有游戏都需要读取和处理输入来自键盘.鼠标.游戏手柄.操纵杆.VR 控制器等设备. 构 ...

  2. [Unity] GameFramework 学习记录 4:第三人称控制器

    我想知道 UEntity 数据表中的编号跟每个实体表自己的编号之间是否需要统一,现在看来好像不需要统一,但是我也不知道是不是因为我还没看到这两个表有交互的时候 哦我才注意到,这个实体表是用来定义资源的 ...

  3. 处理unity第一第三人称游戏中的摄像机穿墙的问题

    在之前我花过一段时间做了一个比较简单的第三人称射击类游戏 发现一个很难搞的BUG 就是在我们设定的摄像机和主角距离的空隙中间 如果有一些物体 会挡住主角 会给人极差的游戏体验 下面有两种解决方案 但是 ...

  4. [Unity] ACT 战斗系统学习 4:重构前的第三人称控制器

    重构前,我的控制器是这样子 Assets/MeowACT/Scripts/ThirdPerson/ThirdPerson.cs // --------------------------------- ...

  5. [Unity3d]第一人称和第三人称视角完美切换

    最近一直在搞3D漫游,在第一人称和第三人称视角切换碰到些问题,视角的例子我是导入的官方的character controller包,不得不佩服官方脚本语言的写法,看了一下写的很完美,新手估计比较难看懂 ...

  6. 虚幻四如何实现第一人称_ue4用C++怎么实现第一人称和第三人称之间的切换?

    我最近也在做这个,所以说一下自己的思路,,,, 你应该去看看官方的第一人称射击例子,,,我自己的话大致有两种做法,,, 首先说镜头, 第一种,效果好一点的,需要两个模型和两个动作蓝图,一个是第三人称模 ...

  7. [Godot] v4.0.alpha1 GDScript 实现第三人称控制器

    版本:v4.0.alpha1.official [31a7ddbf8] 1. 完整代码 https://github.com/CheapMiao/Godot-ThirdPersonController ...

  8. UnityRPG第三人称控制器

    ## 引言: * 之前一直都很苦恼角色控制器和相机的跟随编写,最新版本中unity官方更新了InputActionAssety和StarterAssets,下面对其进行简单的介绍 * ### 下载示例 ...

  9. unity第三人称控制器2020.,在导入的时候没有选择重新启动,导致无法控制角色移动

    1.在window中打开package Manager 2.把packages选择为unity Reigistry搜索Input System,然后安装就可以了

最新文章

  1. 爬取王垠的博客并生成pdf
  2. git bash的安装与配置
  3. WPF的binding
  4. ARM处理器工作模式
  5. goland 方法注释_goland 设置注释模板的过程图文详解
  6. java 当地时间_【JAVA】获取当地时间
  7. 信息学奥赛一本通(1106:年龄与疾病)
  8. 如何打开.azw3 .epub .mobi文件?
  9. excel表格分割线一分为二_高效秘技!用EXCEL制作导航页和日志表管理日常工作...
  10. 解决搭载M1芯片的Mac上安装犀牛Rhinoceros 7 for Mac的安装教程
  11. android gridview 详解,Android开发 GridView详解
  12. android中打开地理位置,Android中获取地理位置经纬度
  13. linux 运维工程师必备技能
  14. mybatis学习与理解
  15. lubuntu-调整分辨率
  16. c语言程序 存款利息的计算,【c语言】存款利息的计算
  17. 博途PLC 中位值滤波算法(FC功能块)
  18. 时尚快消品大行其道 高利润率堪比苹果公司
  19. 柯尼卡美能达Konica Minolta bizhub 308 打印机驱动
  20. 软件授权加密算法研究

热门文章

  1. Oracle 创建DBLink方法
  2. 二手交易小程序毕业设计,二手物品交易小程序系统设计与实现
  3. (转)利用libcurl获取新浪股票接口, ubuntu和openwrt实验成功(三)
  4. HTML5期末大作业:文化网页设计——西餐文化5页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
  5. 证书转换-SSL证书生成:cer,jks文件 韩俊强的博客
  6. SQL学习(一):months_between日期函数
  7. JavaScript定时器的各种案例
  8. 高手总结的9种 OOM 常见原因及解决方案
  9. airpods固件更新方法_Airpods怎么更新固件
  10. 税款输入不正确(代码J1,金额 0.00),改正 17.00 CNY