Unity 3D 实现第一人称视角

这篇具有很好参考价值的文章主要介绍了Unity 3D 实现第一人称视角。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

第一人称视角的运用十分广泛,常见于我的世界、APEX、守望先锋以及许多FPS(First-Person Shooting第一人称射击)等游戏。

教程

那么,这类第一人称视角是如何实现的呢?

其实并不复杂,一个人物模型一个摄像机一个脚本,便可轻松实现。

1.创建人物模型

在 Hierarchy 栏目右击随机创建一个 3D Object

2.调整摄像机位置

将 Main Camera 拖动到创建好的 3D Object 模型下,成为它的子物体

调整好摄像机在模型内部的位置,充当眼睛,(建议放在中上部),来获取周围的环境

至此,一个简单的人物就做好了,有没有感到非常激动呢

3.编写脚本(核心部分)

姿态讲解

第一人称视角的旋转,事实上就是摄像机(Camera)不断发生姿态改变的过程

物体在三维空间中姿态的改变,可以被描述为3种基本行为:俯仰(pitch)、偏转(yaw)、翻滚(roll)
Unity 3D 实现第一人称视角,unity,3d,游戏引擎
俯仰(pitch):绕X轴旋转(类似于汽车上下坡)
偏转(yaw):绕Y轴旋转(类似于军训原地向左转、向右转)
翻滚(roll):绕Z轴旋转(类似于烤串)
*第一人称不用Z轴

因此,想要完成第一视角的移动,我们得达到以下目的:
鼠标向前移动时,进行向上的仰视
鼠标向后移动时,进行向下的俯视
鼠标向左移动时,进行向左(逆时针)的偏转
鼠标向右移动时,进行向右(顺时针)的偏转

代码讲解

如何用代码实现呢?
只需三步即可:获取摄像机、*计算转动角度将计算出的值赋给摄像机

获取摄像机
public Transform camera;//存放相机

在 Main Camera 的 Inspector 中要将 Main Camera 绑定到对应位置

*计算转动角度

欧拉角
在Unity中,欧拉角(Euler Angles)用于描述物体的旋转状态,它由三个角度组成(X, Y, Z),即俯仰角(pitch)、偏转角(yaw)和翻滚角(roll)
在Transform组件中,可以通过eulerAngles属性获取或设置物体的欧拉角

首先设定俯仰偏转时的鼠标灵敏度

public float mousePitchSensitivity;//俯仰的鼠标灵敏度(绕X轴)
public float mouseYawSensitivity;//偏转的鼠标灵敏度(绕Y轴)

设定俯仰的最大角度(一般人抬头是不能看到后面的,除非你能下腰…)

 public float pitchLimit = 75;//俯仰的最大角度

通过
* 最终角度(AfterRot)=当前角度(localEulerAngles)+变化角度(Rot)
进行计算

float pitch = -Input.GetAxis("Mouse Y")*mousePitchSensitivity;//当前帧的俯仰值(变化的量)
float yaw = Input.GetAxis("Mouse X")*mouseYawSensitivity;//当前帧的偏转值(变化的量)

Vector3 rot = new Vector3(pitch, yaw, 0);//当前帧欧拉角发生的改变量

Vector3 afterRot;//改变后的欧拉角
afterRot.x = Mathf.Clamp(ClampAngle(camera.localEulerAngles.x) + rot.x, -pitchLimit, pitchLimit);
afterRot.y = camera.transform.localEulerAngles.y + rot.y;
afterRot.z = 0;

这里用到了一个 ClampAngle 函数,用于限制角度于(-180,180)之间
因为在访问物体欧拉角x/y/z数值时,Unity返回的读出值具有周期上的随机性(例如对于俯仰角x = 0,Transform.EulerAngle.x的读出值可能是-360,0,360中的一个)所以以此来避免

//将角度限制在(-180,180)
public float ClampAngle(float angle)
{
    if ( angle<=180 && angle>=-180)
    {
        return angle;
    }

    while (angle>180)
    {
        angle -= 360;
    }

    while (angle<-180)
    {
        angle += 360;
    }

    return angle;
}
附值给摄像机
camera.localEulerAngles = afterRot;//将最终的欧拉角赋给摄像机

这样第一视角便可以实现了文章来源地址https://www.toymoban.com/news/detail-675194.html

完整代码

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.Tracing;
using UnityEngine;

public class LookControl : MonoBehaviour
{
    public Transform camera;//存放相机

    public float mousePitchSensitivity;//俯仰的鼠标灵敏度(绕X轴)
    public float mouseYawSensitivity;//偏转的鼠标灵敏度(绕Y轴)

    public float pitchLimit = 75;//俯仰的最大角度

    //将角度限制在(-180,180)
    public float ClampAngle(float angle)
    {
        if ( angle<=180 && angle>=-180)
        {
            return angle;
        }

        while (angle>180)
        {
            angle -= 360;
        }

        while (angle<-180)
        {
            angle += 360;
        }

        return angle;
    }

    private void Start()
    {
        Cursor.lockState=CursorLockMode.Locked;//将鼠标光标锁定在窗口中心
        Cursor.visible = false;//隐藏鼠标光标
    }

    private void Update()
    {
        float pitch = -Input.GetAxis("Mouse Y")*mousePitchSensitivity;//当前帧的俯仰值(变化的量)
        float yaw = Input.GetAxis("Mouse X")*mouseYawSensitivity;//当前帧的偏转值(变化的量)

        Vector3 rot = new Vector3(pitch, yaw, 0);//当前帧欧拉角发生的改变量

        Vector3 afterRot;//改变后的欧拉角
        afterRot.x = Mathf.Clamp(ClampAngle(camera.localEulerAngles.x) + rot.x, -pitchLimit, pitchLimit);
        afterRot.y = camera.transform.localEulerAngles.y + rot.y;
        afterRot.z = 0;
        camera.localEulerAngles = afterRot;//将最终的欧拉角赋给摄像机
    }
}

到了这里,关于Unity 3D 实现第一人称视角的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用Unity3D制作FPS游戏的学习笔记————人物移动、利用鼠标实现视角转动和人物跳跃(含人物悬空不掉落修复)

    前言: 这是我第一次发布文章,此文章仅供参考,我也是刚学习接触untiy,在制作项目的过程中将有用的写下来记一记,以便自己之后能回头看看,各位大佬轻点喷,若有错误请麻烦积极提谢谢各位。该文章参考自B站UP主蔡先森_rm-rf发布的 【第一人称射击游戏教程2.0【已完结

    2024年04月27日
    浏览(63)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(72)
  • 【游戏开发实战】Unity手游第一人称视角,双摇杆控制,FPS射击游戏Demo(教程 | 含Demo工程源码)

    一、前言 嗨,大家好,我是新发。 有同学私信我,问我能不能写一篇Unity手游第一人称视角控制的教程, 那么,今天就来做个 Demo 吧~ 注: Demo 工程源码见文章末尾 最终效果如下: 二、实现方案 1、无主之地,第一人称视角 第一人称视角的游戏大家应该不陌生,比如《无主

    2023年04月08日
    浏览(48)
  • Unity使用NaveMesh实现第一人称视角移动

    Navemesh寻路系列文章 文章目录 目录 系列文章目录 文章目录 前言 一、NavMeshPath是什么? 二、使用步骤 1.引入库 2.读入数据 总结 navemesh已经大量使用到游戏中,但大部分寻路都是使用SetDestination函数,给予一个目标点移动,第一人称直接操控移动的文章很少。 为了解决这个问

    2024年02月03日
    浏览(35)
  • SuperMap Hi-Fi 3D SDK for Unity制作游戏引擎材质

    kele     在交通,电力,规划等行业中,有的对象常常具有很强的质感,比如金属质感的 钢轨,电力塔;陶瓷材质的绝缘子;玻璃材质的建筑幕墙等,但常规方式的表现效果 往往差强人意。     游戏引擎(Unity3D)中已有丰富的材质资源库,比如玻璃,金属等材质,这

    2024年02月09日
    浏览(84)
  • Unity 3D 人物移动朝向跟随摄像机(第一人称)

    以人物身体旋转控制镜头左右滑动 以摄像机旋转控制镜头上下滑动 首先我们要知道 摄像机是作为人物的子物体的(充当眼睛) 所以当人物旋转时 摄像机会跟随它朝相同的方向旋转相同的角度 从而达到 眼睛(摄像机)注视的方向一定是人物的正前方 那么这样做有什么好处

    2024年02月21日
    浏览(52)
  • 【Unity3D赛车游戏优化篇】【十】汽车粒子特效和引擎咆哮打造极速漂移

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :Unity游戏demo – 😶‍🌫️版本: Unity2021 😶‍🌫️适合人群:Unity初学者进阶 😶‍🌫️学习目标:3D赛车游戏的基础制作 😶‍🌫️技能

    2024年02月09日
    浏览(62)
  • Unity实现一个3D塔防游戏

    Unity是一款游戏引擎,可以用来开发各种类型的游戏。在这篇文章中,我们将使用Unity来创建一个3D塔防游戏。本文将从游戏设计开始,一步一步地讲解如何实现一个基本的塔防游戏。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在

    2023年04月26日
    浏览(47)
  • Unity 2D视角下模拟3D环境和地形

    2D游戏若想模仿3D游戏的环境,一种很好的方案便是“2.5D”。 所谓2.5D,通常的理解是相机固定俯视的游戏视角。在此视角下,人物可以在x、y、z三个轴上移动,如此便能模仿3D游戏的环境,而美术成本要比3D低很多。 2.5D具体实现的方式也分多种,如2D角色+3D场景、3D角色+2D场

    2024年02月06日
    浏览(46)
  • 【Unity】第一人称视角开发

    我的需求是在Unity构建一个第一人称视角,实现移动跳跃功能。 主要参考的是这篇博文提供的方案,不过该方案为了只允许一次跳跃,单独在人物底部构建了一个空对象,我无需此限制,因此对其进行了简化。 创建场景对象如下: Ground 地形对象 Player 胶囊体视作人物 Cube 参

    2023年04月21日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包