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

这篇具有很好参考价值的文章主要介绍了用Unity3D制作FPS游戏的学习笔记————人物移动、利用鼠标实现视角转动和人物跳跃(含人物悬空不掉落修复)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

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

首先制作人物移动需要先制作一个场景和创建一个角色,这里就不再详细赘述如何创建了。

注意:最好创建一个空对象把角色(胶囊体)放进去,父对象坐标保持(0.0.0),仅对子对象进行微调即可,之后创建的父对象也要保持在原点,只动子对象

用Unity3D制作FPS游戏的学习笔记————人物移动、利用鼠标实现视角转动和人物跳跃(含人物悬空不掉落修复),Unity,FPS,游戏开发,游戏,学习,笔记,visual studio,c#创建好角色和场景之后新建文件夹Script创建新的脚本这里取名为PlayerController,将脚本负载到角色Character中,在Character对象里添加Character Controller(角色控制器)组件,修改一下他的半径和高度。

双击新建的脚本先给人物添加移动逻辑

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


public class PlayerController : MonoBehaviour
{
    private CharacterController characterController;
    private Vector3 moveDirction;           //设置人物移动方向


    [Header("玩家数值")]
    public float Speed;
    [Tooltip("行走速度")] public float walkSpeed;
    [Tooltip("奔跑速度")] public float runSpeed;


    [Header("键位设置")]
    [Tooltip("奔跑按键")] public KeyCode runInputName = KeyCode.LeftShift;
    [Tooltip("跳跃按键")] public KeyCode jumpInputName = KeyCode.Space;


    [Header("玩家属性判断")]
    private CollisionFlags collisionFlags;
    public bool isWalk; //判断是否行走
    public bool isRun;  //判断是否奔跑

    void Start()
    {
        characterController = GetComponent<CharacterController>();//获取角色自身控制器
        walkSpeed = 4f;
        runSpeed = 6f;
    }

    
    void Update()
    {
        Moving();
    }

    public void Moving()
    {
        float h = Input.GetAxisRaw("Horizontal");//检测是否按下键盘AD
        float v = Input.GetAxisRaw("Vertical");//检测是否按下键盘WS

        isRun = Input.GetKeyDown(runInputName);//如果按下左shift返回给isRun的值为true,说明玩家按下加速键
        isWalk = (Mathf.Abs(h) > 0 || Mathf.Abs(v) > 0) ? true : false;
        if (isRun)//奔跑行走速度
        {
            Speed = runSpeed;
        }
        else//正常行走速度
        {
            Speed = walkSpeed;
        }
        //设置人物移动方向,(normalized将速度进行规范化,防止斜向走速度变大)
        moveDirction = (transform.right * h + transform.forward * v).normalized;
        characterController.Move(moveDirction * Speed * Time.deltaTime);//人物移动
    }
}

 这里移动逻辑跟UP没差别,使用的是GetAxisRaw方法,这种方法实现的是即松即停,意思就是松开方向键就马上停下,不会再往前滑,但我想做的是松开方向键之后,人物还会往前滑一小段距离,按下反方向键做急停,方法如下:

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


public class PlayerController : MonoBehaviour
{
    private CharacterController characterController;
    private Vector3 dir;           //设置人物移动方向


    [Header("玩家数值")]
    public float Speed;
    [Tooltip("行走速度")] public float walkSpeed;
    [Tooltip("奔跑速度")] public float runSpeed;



    [Header("键位设置")]
    [Tooltip("奔跑按键")] public KeyCode runInputName = KeyCode.LeftShift;
    [Tooltip("跳跃按键")] public KeyCode jumpInputName = KeyCode.Space;


    [Header("玩家属性判断")]
    private CollisionFlags collisionFlags;
    public bool isWalk; //判断是否行走
    public bool isRun;  //判断是否奔跑


    void Start()
    {
        characterController = GetComponent<CharacterController>();      //获取角色自身控制器
        walkSpeed = 4f;
        runSpeed = 6f;
    }

    
    void Update()
    {
        Moving();
    }

    public void Moving()
    {
        
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");


        isRun = Input.GetKey(runInputName);     //如果按下左shift返回给isRun的值为true,说明玩家按下加速键
        isWalk = (Mathf.Abs(h) > 0 || Mathf.Abs(v) > 0) ? true : false;

        if (isRun)   //奔跑行走速度
        {
            Speed = runSpeed;
        }
        else                    //正常行走速度
        {
            Speed = walkSpeed;
        }

        Vector3 dir = new Vector3(h, 0, v);
        dir = transform.TransformDirection(dir);
        characterController.Move(dir * Speed * Time.deltaTime);
    }
}

这样就能实现平滑移动的效果,就类似马里奥里地板抹油一样,更加舒服,后面我也会用该移动进行编写。

接下来是跳跃,跳跃的话在视频合集P9中写完之后发现人物走到高处掉不下去,UP也在后面补充了,我觉得都是属于跳跃逻辑就一并写完吧。代码如下:

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

public class PlayerController : MonoBehaviour
{
    private CharacterController characterController;
    private Vector3 dir;           //设置人物移动方向


    [Header("玩家数值")]
    public float Speed;
    [Tooltip("行走速度")] public float walkSpeed;
    [Tooltip("奔跑速度")] public float runSpeed;
    [Tooltip("跳跃的力")] public float jumpForce;
    [Tooltip("下落的力")] public float fallForce;


    [Header("键位设置")]
    [Tooltip("奔跑按键")] public KeyCode runInputName = KeyCode.LeftShift;
    [Tooltip("跳跃按键")] public KeyCode jumpInputName = KeyCode.Space;


    [Header("玩家属性判断")]
    private CollisionFlags collisionFlags;
    public bool isWalk; //判断是否行走
    public bool isRun;  //判断是否奔跑
    public bool isJump; //判断是否跳跃
    public bool isGound;    //判断是否在地面上

    void Start()
    {
        characterController = GetComponent<CharacterController>();      //获取角色自身控制器
        walkSpeed = 4f;
        runSpeed = 6f;
        jumpForce = 0f;
        fallForce = 10f;
    }

    
    void Update()
    {
        Moving();
        Jump();
    }

    public void Moving()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");


        isRun = Input.GetKey(runInputName);     //如果按下左shift返回给isRun的值为true,说明玩家按下加速键
        isWalk = (Mathf.Abs(h) > 0 || Mathf.Abs(v) > 0) ? true : false;

        if (isRun)   //奔跑行走速度
        {
            Speed = runSpeed;
        }
        else                    //正常行走速度
        {
            Speed = walkSpeed;
        }

        Vector3 dir = new Vector3(h, 0, v);
        dir = transform.TransformDirection(dir);
        characterController.Move(dir * Speed * Time.deltaTime);

    }

    public void Jump()
    {
        isJump = Input.GetKeyDown(jumpInputName);
        //判断玩家按下跳跃键,并且此时在地上,才能进行跳跃
        if (isJump && isGound)
        {
            isGound = false;
            jumpForce = 5f; //设置跳跃力
        }
        //当前没有按下空格并且检测在地面上,那么isGround判断为false(修复在空中isGround还是判定为true的bug)
        else if (!isJump && isGound)
        {
            isGound = false;
        }

        //此时按下跳跃键跳起来了,并且不在地上
        if (!isGound)
        {
            jumpForce = jumpForce - fallForce * Time.deltaTime;  //每秒将跳跃力进行累减,使其下落
            Vector3 jump = new Vector3(0, jumpForce * Time.deltaTime, 0);   //将跳跃力转化成v3坐标
            collisionFlags = characterController.Move(jump);    //调用角色控制器移动方法,向上方法模拟跳跃

            /*判断玩家在地上
             CollisionFlages:CharacterController 内置的碰撞位置标识号
            CollisionFlags.Below -->在地上*/
            if (collisionFlags == CollisionFlags.Below)
            {
                isGound = true;
                jumpForce = -2f;
            }
        }
    }
}

这样人物移动跳跃就已经做好了,剩下视角移动,我们先将Main Camera拖进我们创建的角色里做我们角色的子对象,将坐标轴重置,调整至合适位置,将剪裁调至0.01,在Script文件夹下创建MouseLook脚本,并将其拖入Main Camera内。用Unity3D制作FPS游戏的学习笔记————人物移动、利用鼠标实现视角转动和人物跳跃(含人物悬空不掉落修复),Unity,FPS,游戏开发,游戏,学习,笔记,visual studio,c#

双击MouseLook脚本,输入以下代码:

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


/// <summary>
/// 摄像机的旋转
/// 玩家左右旋转控制实现左右移动
/// 摄像机上下旋转控制视线上下移动
/// </summary>
public class MouseLook : MonoBehaviour
{
    [Tooltip("鼠标灵敏度")] public float mouseSenstivity = 400f;
    private Transform playerBody;   //玩家位置
    private float yRotation = 0f;   //摄像机上下旋转

    [Tooltip("当前摄像机的初始高度")] public float height = 1.8f;



    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;       //将鼠标隐藏并锁定在屏幕中心
        playerBody = transform.GetComponentInParent<PlayerController>().transform;
    }


    void Update()
    {
        float mouseX = Input.GetAxis("Mouse X") * mouseSenstivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * mouseSenstivity * Time.deltaTime;

        yRotation -= mouseY;    //将上下旋转的轴值进行累计
        yRotation = Mathf.Clamp(yRotation, -80f, 80f);      //限制摄像机上下旋转角度
        transform.localRotation = Quaternion.Euler(yRotation, 0f, 0f);  //摄像机上下旋转
        playerBody.Rotate(Vector3.up * mouseX); //玩家左右移动
    }

}

这样一来基本的角色移动控制就已经写完了,整体来讲这方面还是比较简单的,除了人物在高处悬空以外也没啥易踩的坑,如果你不是用Character Controller来控制角色而是用Rigidbody(刚体)来处理角色的话就不会出现高处悬空问题,Rigidbody是Unity自带的组件,里面添加了物理引擎的运算,但是如果是用来控制人物角色的话还是Character Controller会比较好。

这次的分享就到这里,感谢阅读,如有问题可及时提出,读者可以和视频一起观看,更好理解。文章来源地址https://www.toymoban.com/news/detail-860099.html

到了这里,关于用Unity3D制作FPS游戏的学习笔记————人物移动、利用鼠标实现视角转动和人物跳跃(含人物悬空不掉落修复)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Unity学习笔记】b站Unity架构课Unity3D 商业化的网络游戏架构(高级/主程级别)

    自己跟着学完了,写了不少代码,会放在CSDN代码库,因为老师并没有提供源码,录屏也不是完全连续,所以难免 有代码缺少、无法运行 的情况,但是确实学到了不少真本事,主要是了解老师的架构思想。 b站课程地址 课程我自己是跟着学完了的,本文是个人笔记记录和好课

    2024年02月02日
    浏览(52)
  • unity3d人物碰撞提示文字

    设置碰撞体,例如cube 将脚本挂载在物体上,碰撞显示text 碰撞体的子物体,例如3dObject-legacy-text 绑定代码,使文字一直正对屏幕(相机)

    2024年02月11日
    浏览(55)
  • Unity3D方向键控制人物移动的代码

    也可以换成 Translate 函数默认模式是 Space.Self ,此时移动方向需要为人物坐标系下的人物前进方向 Vector3(0, 0, 1) ;如果模式指定为 Space.World ,移动方向应该为世界坐标系下的人物前进方向 transform.forward , transform.forward 在人物转向过程中会改变。如果不注意这个问题,人物转

    2024年02月11日
    浏览(57)
  • Unity3D学习记录01:URP渲染管线以及3D游戏场景设置

    以下内容所使用的版本均为Unity2022.3 先在 Window-Package Manager-Unity Registry 里面搜索添加Universal RP   Unity中,创建渲染管线的方式为Asset文件夹下右键 Create-Readering-URP Asset(with Universal Asset) 会创建以下两个Pipeline:  接着在图中的设置里添加这两个渲染管线(Project Setting在Edit窗口下

    2024年02月08日
    浏览(58)
  • Unity3D学习笔记——物理引擎

    1简介 刚体可以为游戏对象赋予物理特性,是游戏对象在物理系统的控制下接受推力和扭力,从而实现现实世界的物理学现象。 2属性 1简介 碰撞器是物理组件的一类,他与刚体一起促使碰撞发生 碰撞体是简单形状,如方块、球形或者胶囊形,在 Unity 3D 中每当一个 GameObjects

    2023年04月12日
    浏览(49)
  • Unity3D中实现人物的第一人称视角

    打开unity创建一个场景地图可以添加一个Plane作为地面 在Hierarchy视图中右键创建一个胶囊体(Capsule)作为Player,添加好后重置胶囊体的位置,并且调整胶囊体在一个合适的位置。 将Main Camera拖拽到到player内作为子对象,重置一下Main Camera的transform,并且再调整一下它在player中

    2024年02月11日
    浏览(67)
  • Unity3D学习笔记8——GPU实例化(3)

    在前两篇文章《Unity3D学习笔记6——GPU实例化(1)》《Unity3D学习笔记6——GPU实例化(2)》分别介绍了通过简单的顶点着色器+片元着色器,以及通过表面着色器实现GPU实例化的过程。而在Unity的官方文档Creating shaders that support GPU instancing里,也提供了一个GPU实例化的案例,这里就详

    2023年04月22日
    浏览(43)
  • Unity3D制作天空盒

    1、下载并导入hdr高动态范围图像资源到Project视图中,然后将图片的“Texture Shape”修改为“Cube”。  3、将步骤1的图片拖入“Cubemap(HDR)”的框内。  4、最后将制作好的材质,直接拖入Scene窗口中。           

    2024年02月15日
    浏览(58)
  • Unity3D高级编程主程手记 学习笔记二:C#技术要点

    1.Untiy3D中C#的底层原理 Unity底层在运行C#程序时有两种机制:一种是Mono,另一种是IL2CPP。 Mono存在的目的是为了跨平台 ,因为最初C#只支持Windows。而IL可以看成是一种汇编语言且完全基于堆栈,必须运行在虚拟机上。也就是说C#会被编译器编译成IL,当需要他们时就会被实时的

    2024年02月08日
    浏览(60)
  • Unity3D粒子系统之制作火焰特效

    本文将会介绍如何使用Unity内的粒子系统制作烟雾效果。 如果想了解Unity粒子系统中的基础属性,可以看这篇博客:Unity3D粒子系统之基础属性介绍 先上预览图吧 用自己熟悉的绘画工具画一张类似这样的图片(相似即可,白灰色部分边缘不规则),注意一定要黑底。 将画好的

    2024年02月02日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包