Unity 第三人称 玩家控制器+相机控制器

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

今天给大家分享一个简单的Unity第三人称视角下玩家控制器和相机控制器的脚本编写方法。

 

效果如下:

一、实现原理

主要分三部分实现:人物旋转、人物移动、相机旋转。

1.人物移动:

首先获取到人物水平和垂直移动的参数:

inputH = Input.GetAxis("Horizontal");//获取水平/垂直移动参数
inputV = Input.GetAxis("Vertical");

因为人物移动的方向跟摄像头一致,所以需要根据摄像头的方向轴来确定玩家的移动方向,然后移动玩家人物刚体组件:

moveDir = mCamera.TransformDirection(inputH, 0, inputV);//人物移动朝向
rigid.MovePosition(transform.position + new Vector3(moveDir.x,0,moveDir.z) * wSpeed * Time.fixedDeltaTime);//移动人物

 2.相机旋转:

首先获取鼠标水平/垂直移动参数,再使相机跟随人物,更新旋转:

mouseX += Input.GetAxis("Mouse X") * xSpeed * Time.deltaTime;//更新鼠标水平/垂直移动参数
mouseY += Input.GetAxis("Mouse Y") * ySpeed * Time.deltaTime;
transform.position = body.position;//相机跟随人物移动
transform.rotation = Quaternion.Euler(mouseY, mouseX, 0);//相机旋转

3.人物旋转:

首先由水平/垂直移动的参数计算得到旋转角度:

float targetRotation = (Mathf.Atan2(inputH, inputV) * Mathf.Rad2Deg + mCamera.eulerAngles.y

这里注意人物旋转要基于当下相机的方向,如果只是基于人物模型方向,会发生人物移动与人物旋转方向不一致的情况,如下图,人物倒退地相机前走:

Unity 第三人称 玩家控制器+相机控制器

得到角度后利用Mathf.SmoothDampAngle()函数较为丝滑地旋转人物:

transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref currentVelocity, smoothTime, rSpeed, Time.deltaTime);

二、物体层级

物体层级如下:

 Unity 第三人称 玩家控制器+相机控制器

玩家组件挂载在人物预制体上,并创建RigidBody和Collider等组件。再创建一个空物体,坐标与玩家人物相同,将MainCamera作为子物体,并调节相机位置。

三、完整代码

PlayerController.cs

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

public class PlayerController : MonoBehaviour
{
    private Rigidbody rigid;//玩家刚体
    private Animator animator;//玩家动画机
    public Transform mCamera;//相机组件

    private Vector3 moveDir;//人物移动方向
    private float currentVelocity = 1;//目前的转向速度(SmoothDampAngle函数的返还参数)
    private float smoothTime = 0.1f;//完成平滑的时间(SmoothDampAngle函数的参数)
    public float wSpeed;//移动速度
    public float rSpeed;//旋转速度
    public float jPower;//跳跃力度
    private float inputH;//水平移动参数
    private float inputV;//垂直移动参数
    private bool isMove;//是否移动
    private bool isRun;//是否奔跑
    private bool isGround;//是否在地面上

    void Start()
    {
        rigid = GetComponent<Rigidbody>();
        animator = GetComponent<Animator>();
    }

    void Update()
    {
    }

    private void FixedUpdate()
    {
        inputH = Input.GetAxis("Horizontal");//获取水平/垂直移动参数
        inputV = Input.GetAxis("Vertical");
        animator.SetFloat("inputH", inputH);//更新动画机参数
        animator.SetFloat("inputV", Mathf.Abs(inputV));
        animator.SetBool("isMove", isMove);
        animator.SetBool("isRun", isRun);
        if(Input.GetKeyDown(KeyCode.Space))
        {
            isGround = false;
            animator.CrossFade("Jump", 0.1f);
            rigid.AddForce(0, jPower, 0);//给刚体向上的力
        }//更新跳跃动画
        if (inputH != 0 || inputV != 0)
        {
            isMove = true;
            transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, (Mathf.Atan2(inputH, inputV) * Mathf.Rad2Deg + mCamera.eulerAngles.y), ref currentVelocity, smoothTime, rSpeed, Time.deltaTime);
        }//改变人物朝向
        else
        {
            isMove = false;
        }//更新移动状态
        if (Input.GetKey(KeyCode.LeftShift))
        {
            wSpeed = 6;
            isRun = true;
        }//更新奔跑状态
        else
        {
            wSpeed = 3;
            isRun = false;
        }
        moveDir = mCamera.TransformDirection(inputH, 0, inputV);
        rigid.MovePosition(transform.position + new Vector3(moveDir.x,0,moveDir.z) * wSpeed * Time.fixedDeltaTime);//移动人物
    }

    private void OnCollisionEnter(Collision collision)
    {
        if(!isGround)
        {
            if(collision.gameObject.CompareTag("Ground"))
            {
                isGround = true;
            }
        }//判断是否接地
    }
}

CameraController.cs

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

public class CameraController : MonoBehaviour
{
    public Transform body;//玩家人物组件

    public float maxY = 40;//相机旋转上界限
    public float minY = -10;//相机旋转下界限
    public float xSpeed = 250;//相机纵向旋转速度
    public float ySpeed = 125;//相机横向旋转速度
    private float mouseX;//鼠标水平移动参数
    private float mouseY;//鼠标垂直移动参数

    void Start()
    {
        
    }

    void Update()
    {
        mouseX += Input.GetAxis("Mouse X") * xSpeed * Time.deltaTime;//更新鼠标水平/垂直移动参数
        mouseY += Input.GetAxis("Mouse Y") * ySpeed * Time.deltaTime;
        mouseY = clampAngle(mouseY);
        transform.position = body.position;//相机跟随人物移动
        transform.rotation = Quaternion.Euler(mouseY, mouseX, 0);//相机旋转
    }

    private float clampAngle(float angle)
    {
        if (angle < -360)
        {
            angle += 360;
        }
        if (angle > 360)
        {
            angle -= 360;
        }
        return Mathf.Clamp(angle, minY, maxY);
    }//控制相机上下旋转角度
}

欢迎大家在评论区交流学习~文章来源地址https://www.toymoban.com/news/detail-457778.html

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

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

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

相关文章

  • Unity第三人称如何让人物始终朝向相机方向移动

    不知道如何制作简易第三人称相机的同学可以看我的这篇文章:Unity如何实现第三人称相机跟随 我们在开发第三人称游戏过程中很容易遇到:我们的玩家角色,他面对北方,背后有一台摄像机,正巧也是面对北方。现在,他向右转90度,面对东方。此时如果让他向前走,那么

    2024年02月06日
    浏览(56)
  • unity-第三人称摄像机简单脚本(包括跟随、视角旋转、滚轮缩放)

    本菜鸟为了实现第三人称视角摄像机的主要功能,踩了很多意料之外的坑,终于搞出一份自觉完美的脚本,分享一下。 功能:摄像机跟随、鼠标滚轮缩放视野、长按鼠标右键左右旋转视野、长按鼠标中键上下旋转视野。 此脚本挂接在摄像机上,有详细注释,可直接运行。

    2024年02月08日
    浏览(36)
  • unity3d 实现第三人称移动与摄像机调整

    首先展示效果 unity3d 关于人物移动,这里推荐使用Character Conrroller组件,优点就是可以不用处理刚体,不受重力的影响,自带物理碰撞检测。  人物移动代码包括转向 接下来就是摄影机的调整,这里使用unity自带的插件cinemachine,非常的推荐,无需使用冗杂的代码即可设计较好

    2024年02月11日
    浏览(33)
  • 第三十章 Unity角色控制器 Character Controller

    在我们之前的章节中,我们已经了解了碰撞体和刚体。但是,对于刚体这个组件来讲,有两种使用方式。其一就是用它来模拟现实世界的移动或碰撞效果(例如,门的开关);其二就是使用代码来控制物体移动或碰撞(例如,角色的行走)。两种方式使用场景不同而已。 本章

    2024年02月08日
    浏览(32)
  • ue4第三人称第一人称切换。

    1.默认第三人称。将远点的相机设置auto active为true。近点相机设置为false。   在做好的actor中设置camera的active,和人物是否隐藏。    通过v键来切换第一人称和第二人称。

    2024年02月12日
    浏览(35)
  • UE4第三人称多人联机游戏开发01

    单人游戏 中一台电脑只有一个游戏会话(Session),我们可以通过在同一电脑中分屏并用不同的输入设备,单人游戏不需要使用互联网。 多人游戏 中,游戏实例在独立的两台电脑中运行,而由于玩家在不断地输入指令,因此我们需要将一个游戏实例中的信息通过互联网传输到

    2024年02月07日
    浏览(39)
  • UE4 中可全局获取的变量(例如游戏实例、玩家控制器等) 详解

    🙋‍♂️ 作者:海码007 📜 专栏:UE虚幻引擎专栏 💥 标题:UE4 中可全局获取的变量(例如游戏实例、玩家控制器、游戏模式等) 详解 ❣️ 寄语:加油,一次专注一件事! 🎈 最后: 文章作者技术和水平有限,如果文中出现错误,希望大家能指正,同时有问题的话,欢迎

    2024年02月06日
    浏览(38)
  • VR工地安全虚拟现实体验:多种事故模拟,第三人称回看

    建筑工地五大伤害是指:高处坠落、坍塌、物体打击、机械伤害、触电。利用VR(虚拟现实)技术体验建筑工地五大伤害,可以为建筑工人提供更真实、更安全的工作环境,同时也可以帮助他们更好地了解和掌握工作技能。 以下是 VR工地安全虚拟现实体验软件 的价值: 首先,通

    2024年02月12日
    浏览(35)
  • UE4/5 实现多相机模式切换(第一人称切第三人称等)

    对于多相机模式的切换,网上普遍使用SetViewTargetWithBlend这个节点,但这个节点很多相机参数不能设置,也不适合运用于游戏中多相机模式切换的场合。 UE中World Settings里的玩家控制器中,默认的控制器行为会对当前开启的Camera组件进行激活处理: 因此,默认绑在Pawn上的相机

    2024年02月11日
    浏览(29)
  • Unity中人物控制器

       在Unity中控制器是很常见的功能,一般的人物控制器有两种方法,一种是通过代码实现,另外一种就是通过Unity中的API实现。   这里主要介绍第一种方法。   首先对控制器步骤进行分析。 步骤1:通过方向键控制人物移动。 步骤2:控制摄像机跟随人物 步骤1:通过方

    2024年02月13日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包