精华内容
下载资源
问答
  • 2D角色控制器 这是Unity中免费用于2D平台游戏的角色控制器。 当前,控制器具有以下功能: 运动平稳 跳跃的 蹲下 设置动画的事件 2D物理 要了解如何使用它,请观看我们关于2D运动的视频。 该脚本基于Unity作为其...
  • Ultimate Character Controller是是一款专业的运动角色控制器,旨在包括最流畅的第一和第三人称控制,并在所有领域表现出色:PC,移动,控制台,AI,网络和VR 它包含许多其他角色控制器中通常不具备的独特功能 - 从...
  • Unity3D 角色控制器CharacterController

    千次下载 热门讨论 2013-08-21 22:09:24
    文章Unity3D学习笔记04:角色控制器CharacterController控制人物移动旋转 的项目源码,免费下载。
  • 使用角色控制器 1. 使用物理引擎操作 物理引擎操作的好处是可以使用诸多物理特性。当游戏有大量碰撞或移动特性时,使用这个比较好。比如赛车游戏。你可能需要设置赛车的重量来决定过弯的表现和撞车时力反馈的计算,...

    简介

    操作人物移动,我们一般有以下几种办法:

    1. 直接操作坐标
    2. 使用物理引擎操控
    3. 使用动作 Root Motion
    4. 使用角色控制器
    关于坐标操作

    坐标操作,就是通过设置transoform.position坐标 或是Vector.transform 等方法使物体移动到指定坐标。
    该方式的优点,当然是简单暴力。坏处么,各种无互动无反馈,效果太楞。只适合简单的变化操作或是2d游戏。如果需要复杂点的效果,比如曲线过度,重力下降都要自己去实现。需要自己实现呀,兄弟们我们使用引擎的目的是什么,当然是使用提供的工具提升工作效率。不能什么都自己搞呀。所以这个方式只推荐应用在npc或是机关变化。

    关于物理引擎操作

    物理引擎操作的好处是可以使用诸多物理特性。当游戏有大量碰撞或移动特性时,使用这个比较好。比如赛车游戏。你可能需要设置赛车的重量来决定过弯的表现和撞车时力反馈的计算,又或是爆炸时被波及的力度。
    使用物理引擎操作的主要方式就是添加力。由此可知,向前移动就是添加向前的作用力,跳跃就是添加向上的作用力,物理效果会让人物跳跃后自动下降。

    关于Root Motion

    这个方式是我认为最合理,过度最平滑,效果最好的方式。只可惜成本太高实现太难。
    他所需要的技术包括:角色骨骼绑定 + Animation动作库 + Animator动画控制器 + Root Motion根坐标移动
    这就需要我们不仅拥有质量高且数量庞大的动作库,以及各种对动画的精确控制才能实现。我们使用市面上已有的动作库可以实现基本的移动等操作。但总的来说,性能还是不如下面那个,而且开发成本还是比较高的,调试周期特别长,在遇到一些自适应需求的时候开发难度也会增加。
    我相信,不久的将来它会成为游戏引擎中的操控最高级形态,并且在技术的推动下变得更加易用。

    使用角色控制器(CharacterController)操作

    这是个unity的组件。一般情况下控制人物的不二选择。那么为什么首选角色控制器呢,有以下几个理由:

    1. 首先他简化了刚体组件,去掉了很多不必要的计算。在人物比较多的场景中,这节省了大量的物理计算。例如物理引擎中的翻转、重力等效果,你肯定不希望你在移动过程中,会因为碰撞到物体而自动变换方向吧,一般做法就是用freezon来限制,其实这些都是没有必要的性能浪费。如果场景中人物较多时,这种优化就等于性能的巨幅提升。
    2. 其次,他内置了爬坡、登阶阈值设置。可以比较简单的处理多路况的移动问题。
    3. 第三,这个控制器,非常适合与nevmesh agent连用。即unity自带的巡路系统。当我们使用寻路系统时,如果人物身上有物理刚体,那么不仅会被沿途障碍物所影响,还会出现各种意想不到的情况比如惯性等性质。 如果使用角色控制器。则不必担心出现这种情况。一切都那么顺滑,防侧漏,夜夜安心。
    4. 不必担心被坐标被动作库写死。更不必担心由于动作库的坐标移动而出现意外的坐标干扰。
    5. 这可能是最重要的理由了:如果是网络游戏类型,最好使用坐标或Character Controller的控制实现。这是因为当网络数据传输-帧同步时,我们必须要保证多个客户端的场景数据的一致性。所以不应该使用其他的比较容易出现意外的实现方式。 关于网络游戏数据传输和帧同步,这里有清晰的介绍

    角色控制器(CharacterController)组件参数介绍

    在目标物体的inspector窗口中 点击add components ,添加character controller 即可完成组件添加。
    在这里插入图片描述
    【Slope Limit:】:斜坡角度。允许角色在指定的坡度上行动。
    比如在手游和平精英中,你可能会发现某些房顶的斜坡就能走上去,某些房顶斜坡就走不上去。这都是这个参数所致。虽然和平精英用的是ue4引擎,但使用了和unity原理相似的控制组件。他们都有这个斜坡设置。
    【Step Offset】:台阶高度。允许角色自动越过多高的障碍物。 这个设置就是诸如楼梯,台阶,马路牙子之类的障碍,你总不能遇到个小东西就卡住吧,有了这个就可以越过去。有人说,我没有用character controller,用刚体也能越过比较低矮的障碍物啊,怎么回事呢? 那是因为你的碰撞盒下方并不平整,比如胶囊或圆形碰撞盒,由于下方是曲线过度的,所以会在接触物体时通过物理计算的推动下摩擦过去。这种方式不容易控制并且会可能发生意外情况。
    【Skin Width】:皮肤宽度。这个就相当于第二层碰撞盒。这个值不能大于下方的碰撞盒的Radius值。否则会卡在某个地方。一般情况这个值应该在Radius的5%左右会比较好
    【Min Move Distance】:最小移动范围。当你在代码中使用Move方法移动时,小于这个值的移动将被忽略。这个值可以帮你减少角色因操作产生的抖动。
    【Center】:角色碰撞盒偏移。设置物理空间的位置,你需要通过调整这个来使碰撞盒与角色模型重合。
    【Radius】:碰撞盒半径。角色控制器的自带碰撞盒是胶囊,这个值用来设置胶囊半径。这个设置还有另一个影响,这个半径值将影响脚本中的isGrounded属性的作用范围。这对我们实现控制角色y坐标位置,比如跳跃等功能极其重要。
    【Height】:碰撞盒高度。同上,胶囊高度。

    角色控制器(CharacterController)使用

    在添加了CharacterController的物体上新建一个脚本。

    //获取 CharacterController对象
    CharacterController _characterController = gameObject.GetComponent<CharacterController> ();
    
    移动的实现

    以下是两种移动方式。分别是世界坐标和本地坐标

    //移动方向
    private Vector3 moveDirection = Vector3.zero;
    //移动速度
    float movespeed  = 2f;
    void FixedUpdate(){
    	//世界坐标移动  适用于2d游戏,有固定的方向
    	_characterController.Move(Vector3.up * movespeed * Time.deltaTime);
    
    	//角色坐标移动实现   基于当前角色视角的方向移动,适用于3d游戏
    	//根据输入的x y值获得移动方向
    	float vertical = Input.GetAxis ("Vertical");
        float horizontal = Input.GetAxis ("Horizontal");
        moveDirection = new Vector3(horizontal, 0f, vertical);
        // 计算 基于当前物体坐标,要移动的方向
        moveDirection = transform.TransformDirection(moveDirection) * movespeed;
        // 移动
        _characterController.Move(Vector3.up * movespeed * Time.deltaTime);
    }
    
    跳跃的实现
    public float jumpPower = 3f;
    public float speed = 10f;
    public float gravity = 10f;
    private Vector3 moveDirection = Vector3.zero;
    void FixedUpdate() {
       //isGrounded属性 用于 检测当前角色下方是否接触到地面。这个属性表现并不稳定,至少在我的unity2020中他不够稳定,经常闪烁。所以需要我们再用一个射线检测的方法来辅助。
        if(_characterController.isGrounded || IsGrounded(0.2f)) {
           moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0f, 				Input.GetAxis("Vertical"));
           moveDirection = transform.TransformDirection(moveDirection);
           moveDirection *= speed;
           if (Input.GetButton("Jump"))
               moveDirection.y = jumpPower ;
           }
           // 角色在世界中自动下降,模拟重力
           moveDirection.y -= gravity * Time.deltaTime;
           controller.Move(moveDirection * Time.deltaTime);
    }
    // 射线检测,抛砖引玉 我这里使用五个射线。实际上不需要这么多
     public bool IsGrounded(float distance){
     		//pointOffset: 点的偏移位置, distance:检测物体与地面的距离
            float pointOffset= 0.12f;
            bool b = Physics.Raycast(new Vector3(transform.position.x, transform.position.y, transform.position.z), -Vector3.up, distance);
            bool b1 = Physics.Raycast(new Vector3(transform.position.x - pointOffset, transform.position.y, transform.position.z), -Vector3.up, distance);
            bool b2 = Physics.Raycast(new Vector3(transform.position.x + pointOffset, transform.position.y, transform.position.z), -Vector3.up, distance);
            bool b3 = Physics.Raycast(new Vector3(transform.position.x, transform.position.y, transform.position.z + pointOffset), -Vector3.up, distance);
            bool b4 = Physics.Raycast(new Vector3(transform.position.x, transform.position.y, transform.position.z - pointOffset), -Vector3.up, distance);
            return b || b1 || b2 || b3 || b4;
        }
    

    这里只是简单的实现,在实际的需求中,你可能要捕捉人物的跳跃状态,为人物跳跃指定起跳、浮空、落地等动作,还要设置原地起跳高度,移动跳跃距离等设定等。

    注意事项
    1. 如果主人公身上有animator 需要看情况去掉root motion选项。该选项有可能导致坐标冲突
    2. CharacterController.isGrounded 这个会闪烁。所以会导致很多意外情况。可选的解决方案是:
      一、碰撞盒替代。是比较理想的方案。
      二、CharacterController.isGrounded + 射线辅助的方式。性能会好一些。不可以单独只使用射线。这样会存在盲点。

    完成的效果

    在这里插入图片描述

    展开全文
  • 而对于第三人称而言,人物角色的所有状态全部暴露在玩家的视角之下,关于角色的所有的动画、逻辑、相机表现都要能够让玩家感受到最完美的体验 1,角色模型导入: 在开始使用Unity设计开发第三人称游戏之前,我们需要...

    前言:

    无论是RPGACTAVG还是TPS游戏,都有大量的以第三人称为人物视角的游戏作品,尤其是TPS,直接以第三人称为特点来命名

    游戏类型:

    • RPG:角色扮演游戏
    • ACT:动作游戏
    • AVG:冒险游戏
    • SRPG:模拟类角色扮演游戏
    • TPS:第三人称设计游戏

    而对于第三人称而言,人物角色的所有状态全部暴露在玩家的视角之下,关于角色的所有的动画、逻辑、相机表现都要能够让玩家感受到最完美的体验

    1,角色模型导入:

    在开始使用Unity设计开发第三人称游戏之前,我们需要先获得合适的角色模型。Unity支持多种格式的模型,而当我们使用具有动画的模型时,往往选择fbx格式的模型

    选择好模型后,就可以将模型导入到Unity中,然后我们需要对模型进行一些参数调整,点击模型后,就可以在Inspector面板看到这些参数:
    在这里插入图片描述

    也许大家看到这些英文参数有些蒙,没关系,可以点击右上角的问号查阅官方文档来了解这些参数的意义,同时我也在下面列出了几个关键点来帮助大家完成设置:

    1,如果角色模型导入场景过大:

    • 针对这个问题,大多数小伙伴可能会直接调整场景中角色的Transform组件的Scale来进行缩放,我们要尽量避免这么做,而是在模型的Scale Factor来调整你的模型的大小:
      在这里插入图片描述

    2,对于Rig选项下的Animation Type选项的选择:

    • 由于我们的角色往往是人类,所以我们一般选择Humanoid作为Animation Type,关于这个选项还有更好的方法,选择一个可以让你动画正常播放的选项:
      在这里插入图片描述

    3,关于第三个选项Animation

    • 后面会讲到

    2,角色动画控制器

    为了使得角色可以根据玩家的操作做出相应的动画,可以使用动画控制器来对一系列的状态动画进行管理,这里可以查看我写的关于角色动画的博客:

    Unity人物动画:

    但是本次案例,我们讲一个全新的动画配置效果:动画混合树

    通过动画混合树,可以使得我们的角色动画过渡的更加平滑,使得玩家的游戏体验更加真实,而创建动画混合树的具体步骤为:

    2.1,创建动画混合树:

    1,在Animator面板右击选择Create state,并在其中选择From New Blend Tree即可完成创建,
    在这里插入图片描述
    创建完Blend Tree后,我们点击即可进入动画控制树配置面板:
    在这里插入图片描述
    可以看到,创建该State同时会自动创建一个参数,这个参数类似于我们添加一个float参数,可以通过调整这个值来平滑的切换几种 状态:下面我们就为该动画混合树添加几种状态:

    右键刚刚创建Blend Tree,或者在右侧点击加号,即可为该树添加状态,也就是动画,
    在这里插入图片描述
    完成创建后,主要需要调整的几个地方在下面的红框里面:
    在这里插入图片描述

    关于Blend Type,即动画混合类型,通过点击倒角发现有下面 几种混合方式:
    在这里插入图片描述

    因为本案例采用速度控制动画切换的方式,因此直接选择1D来作为动画混合类型,即只需要通过最右边的一个数值框的参数来控制动画切换即可,当我们把动画拖入后,选择好三个状态对应的参数,当参数权值慢慢靠近某种状态的对应参数时,动画也会慢慢的转换,如图:
    在这里插入图片描述
    从图中可以看出,三种动画经过混合后,可以实现这种由慢到快的平滑的系列动画

    2.2,如何通过脚本使用混合树:

    和Unity人物动画配置那一章类似,我们可以直接使用Blend来实现动画平滑移动,比如说,人物从静止到移动的动画切换,可以通过一个插值来获取动画需要切换的速度:

    	private float Blend;
     	private Animator ani;
    	private void Start()
        {
            ani = this.GetComponent<Animator>();
        }    
        private void Update()
        { 
            if(Input.GetKey(KeyCode.W))
            {
                Blend = Mathf.Lerp(Blend, 0.5f, 0.01f);            
            }
            if (!Input.GetKey(KeyCode.W))
            {
                Blend = Mathf.Lerp(Blend, 0, 0.01f);
            }
            ani.SetFloat("Blend", Blend);
        }
    

    这样当我们按下W时,控制动画混合树的参数就会插值增加,直到0.5(对应移动状态)而不按W时,动画插值回到0,人物慢慢停止移动

    3,角色移动旋转控制

    3.1,为角色添加组件

    在进行脚本编写之前,我们需要为场景中模型添加一些组件来帮助我们实现角色移动、旋转,以及角色动画控制等功能:

    添加角色控制器:

    • 为了实现动画控制,需要为角色添加一个Animator来承载我们刚刚创建的Player动画控制器,同时需要讲模型的骨骼拖入到Avater中,至于下面的参数可以根据需要调整
      在这里插入图片描述

    添加刚体组件:

    • 运动的物体需要通过刚体来模拟其物理效果,我们需要控制角色的移动和旋转,因此需要该组件,但是同时,该组件的某些物体特性又是我们不需要的:
    • 因为我们控制物体时旋转时,仅仅需要其在Y轴上的效果,而X轴或者Z轴的旋转往往会导致我们的角色倾倒在地,这显然不是我们需要的,所以我们可以通过在Constraints中的Freeze Rotation中勾选X和Z来冻结其旋转功能
      在这里插入图片描述

    添加碰撞体:

    • 为了确保角色可以尽量真实,而不是无敌到可以穿越墙体或地面,就需要给其添加合适的碰撞体,可以点击Edit ColliderScene面板调整其大小,也可以直接调整下面三行参数来调整:
      在这里插入图片描述

    3.2、脚本控制角色运动

    第一种方案:

    在这里插入图片描述

    移动:

    • 首先是角色的移动,通过系列计算来计算出角色移动的位置,然后使用rigidbody.MovePosition()方法来控制角色移动到该位置

    旋转:

    • 判断角色的面对的方向与移动方向的角度来判断是否需要旋转,如果角度大于0,则可以通过Vector3.Slerp()方法来进行插值旋转

    动画:

    • 监控玩家键盘的输入,插值改变控制动画播放的参数,并将该参数与移动旋转结合,这样动画就可以完美适配角色的状态的改变
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PlayerControl : MonoBehaviour
    {
        private Transform m_transform;
        private Rigidbody rigidbody;
        private Animator ani;
    
        //移动速度与旋转速度 
        private float transloatSpeed=2.5f;   
        private float rotateSpeed=5;
    
        private Vector3 targetPos;
        private float Blend;
    	//获取前面添加的组件
        private void Start()
        {
            m_transform = this.transform;
            rigidbody = this.GetComponent<Rigidbody>();
            ani = this.GetComponent<Animator>();
        }  
        private void Update()
        {
            //引入动画参数
            ani.SetFloat("Blend", Blend);
            
            //通过监控用户输入,判定角色移动向量,并在FixUpdate中控制角色移动到目标位置
            Vector3 v3 = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")).normalized;
            targetPos = v3 * Time.deltaTime * transloatSpeed * Blend;
    
            //通过角色移动目标向量与角色自身的正方向插值决定旋转角度,并使用rotation进行旋转
            Vector3 targetDir = Vector3.Slerp(m_transform.forward, v3, rotateSpeed * Time.deltaTime);
            m_transform.rotation = Quaternion.LookRotation(targetDir);
    
            //监控用户输入,控制动画参数
            if (Input.GetKey(KeyCode.W)||Input.GetKey(KeyCode.S)|| Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
            {            
                if(Input.GetKey(KeyCode.LeftShift))
                {
                    Blend = Mathf.Lerp(Blend, 1f, 0.03f);
                    return;
                }
                Blend = Mathf.Lerp(Blend, 0.5f, 0.03f);
            }
            if (!(Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)))
            {
                Blend = Mathf.Lerp(Blend, 0, 0.03f);
            }
        }
        private void FixedUpdate()
        {
            //通过目标向量与自身位置控制角色移动
            rigidbody.MovePosition(targetPos + m_transform.position);
        }
    }
    

    这样就可以有一个比较好的旋转与启动的效果,但是当我们启动后,发现角色的移动是基于世界坐标,我们按下W时,永远都是面向世界坐标的Z轴移动,而不是向着当前状态角色面对的方向移动,所以这种设计比较适合视角固定的第三人称游戏手游,比如说王者荣耀,可以得到一个较为顺滑的体验

    产生 这种情况是因为:

    • rigidbody.MovePosition()是相对于世界坐标来计算的,而产生旋转后,角色的世界坐标方向不发生改变,所以再次移动时,依旧会以坐标轴计算

    第二种方案:

    大致的显示效果(类似于原神的第三人称控制效果):
    在这里插入图片描述

    角色控制脚本:

    为了可以和相机有一个更好的融合,通过对于相机方向的判断,然后决定角色的正方向,这样可以直接伴随相机来进行设计,为了有一个更好的效果,可以使用一个相机插件Cinemachine来使得游戏体验更好:

    由于我们相机镜头可以自由围绕Y轴自由旋转,所以可以让相机来承担旋转人物,角色的角度可以根据相机的角度来改变,这样可以有一更好的体验:当我们按下W时,角色就会背向相机移动,给玩家更真实的体验:

    大概解释一下代码:

    • 1,首先当我们输入控制变量时(WASD),动画参数blend会插值增大,同时速度也会根据该参数的变化而变化,角色会产生向前移动的效果
    • 2,接下来要控制角色的转向,我们角色转向的参照物是依据与相机,当玩家按下W时,我们要保证角色背对相机来移动,要实现这样的效果,首先通过
      Vector3.ProjectOnPlane(cam.transform.forward, Vector3.up)方法来获取相机Z轴在世界坐标中X轴与Y轴的投影,即水平面,而如果角色forword在与相机的forwordX轴与Z轴的投影不一致,则插值旋转到相机Z轴的投影方向,这样就可以保证玩家按下W的时候,真的会有向前走的感觉,如图,让两个粉色向量方向保持一致
      在这里插入图片描述
    • 3,同理对于按下ASD键时,分别对应相机不同轴在水平面(X轴与Z轴组合的面)的投影,让角色分别旋转到对应的角度即可
    • 4,通过一个Vector3向量来控制角色移动,并加入影响速度的moveSpeedblend两个变量

    下面就是第二个控制脚本的代码,需要注意,除了之前角色添加的组件,还需要获取要跟随的相机

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PlayerTest : MonoBehaviour
    {
        /// <summary>
        ///获取角色的跟随相机
        /// </summary>
        public Camera cam;
        /// <summary>
        /// 获取角色相关组件
        /// </summary>
        private Transform m_transform;
        private Rigidbody rig;
        private Animator anim;
        /// <summary>
        /// 定义几个移动参数
        /// </summary>
        private Vector3 targetPos;
        private Vector3 movePos;
        private Vector3 camPos;
        
        public float moveSpeed=10f;
        private float blend;
    
        private void Start()
        {
            m_transform = this.transform;
            rig = this.GetComponent<Rigidbody>();
            anim = GetComponent<Animator>();
        }
        private void Update()
        {
            Cursor.lockState = CursorLockMode.Locked;
            Cursor.visible = false;
            anim.SetFloat("Blend", blend);
           // cam.transform.LookAt(m_transform);
           // camPos = m_transform.position + new Vector3(0, camy, camZ);
           // cam.transform.position = Vector3.Lerp(cam.transform.position, camPos, 0.1f);
    
            if (Input.GetKey(KeyCode.W))
            {
                blend = Mathf.Lerp(blend, 0.5f, 0.02f);
                targetPos.z = 1;           
                Vector3 targetDir = Vector3.Slerp(m_transform.forward, Vector3.ProjectOnPlane(cam.transform.forward, Vector3.up), 0.02f);
                m_transform.rotation = Quaternion.LookRotation(targetDir, Vector3.up);
            }
            if (Input.GetKey(KeyCode.S))
            {
                blend = Mathf.Lerp(blend, 0.5f, 0.02f);
                targetPos.z = 1;           
                Vector3 targetDir = Vector3.Slerp(m_transform.forward, -Vector3.ProjectOnPlane(cam.transform.forward, Vector3.up), 0.02f);
                m_transform.rotation = Quaternion.LookRotation(targetDir,Vector3.up);
            }
            if (Input.GetKey(KeyCode.A))
            {
                blend = Mathf.Lerp(blend, 0.5f, 0.02f);
                targetPos.z = 1;
               
                Vector3 targetDir = Vector3.Slerp(m_transform.forward, -Vector3.ProjectOnPlane(cam.transform.right, Vector3.up), 0.02f);
                m_transform.rotation = Quaternion.LookRotation(targetDir, Vector3.up);
            }
            if (Input.GetKey(KeyCode.D))
            {
                blend = Mathf.Lerp(blend, 0.5f, 0.02f);
                targetPos.z = 1;
                Vector3 targetDir = Vector3.Slerp(m_transform.forward, Vector3.ProjectOnPlane(cam.transform.right, Vector3.up), 0.02f);
                m_transform.rotation = Quaternion.LookRotation(targetDir, Vector3.up);
            }
            if (!Input.GetKey(KeyCode.W)&&!Input.GetKey(KeyCode.S)&& !Input.GetKey(KeyCode.A) && !Input.GetKey(KeyCode.D))
            {
                targetPos.z = 0;
                blend = Mathf.Lerp(blend, 0f, 0.02f);
            }
    
            movePos = targetPos * Time.deltaTime * moveSpeed* blend;
            transform.Translate(movePos);
        }
    
    }
    
    

    相机插件:

    在完成角色控制脚本的编写后,需要为角色添加一个跟随相机,为了有一个比较好的效果,就不自己编写脚本来实现这种跟随功能, ,而是使用一个官方的相机组件Cinemachine来完成相机的跟随自由视角的效果:

    首先点击Windows中选择Package Manager打开资源管理器,然后再输入框输入Cinemachine找到该相机插件,下载后导入到项目中,由于我已经下载导入了,所以显示为Up to date

    在这里插入图片描述

    当我们导入该插件后,就可以在上面的导航栏中看到Cinemachine的选项,点击后选择Create FreeLook Camera创建一个视角可以自由移动的相机,关于Cinemachine的具体细节大家可以查阅官方文档,这里我仅对要用的参数做一些说明:
    Cinemachine

    最先调整的是Look AtFollow参数,即相机看着谁与相机要跟随谁,很明显,都是我们的角色,所以可以将角色(或者角色的一部分,比如眼睛更合适)拖入其中

    接下来我们观察人物的周围,发现有三个红色的圈,标明了相机可以围绕角色移动的范围,我们同样可以在虚拟相机上面调整其参数:
    在这里插入图片描述

    完成后,我们发现在移动相机时会有一些画面卡顿的问题,这个时候,我们可以点击我们的MainCamera,来修改其中一些参数和图片中一致即可:

    在这里插入图片描述

    总结

    完成这些设置,你可能得到的结果并不尽人意,但是不要灰心,并不是你做的不好,而是最终的效果是受到多个参数影响的,你可以花一些时间来慢慢调整这些参数,打磨你的游戏,最终会有一个好的结果的

    在花费一定时间后,如果你还是觉得效果不尽人意,那你可能需要换一种思路来设计你的第三人称控制器。没有最好的,只有最合适的,加油

    展开全文
  • 角色控制器

    千次阅读 2016-09-21 20:52:18
    【Unity角色控制器 分类:Unity、C#、VS2015 创建日期:2016-04-10 一、简介 设计完毕基本的场景后,一般都需要先运行看看效果如何,即先让场景“动起来”,以方便观察不同的位置,而不是仅仅观察固定...

    【Unity角色控制器

    分类:Unity、C#、VS2015

    创建日期:2016-04-10

    一、简介

    设计完毕基本的场景后,一般都需要先运行看看效果如何,即先让场景“动起来”,以方便观察不同的位置,而不是仅仅观察固定摄像机位置的死板板的场景。

    这就是角色控制器的功能(实际上还不仅仅是只有这些功能)。

    Unity已经帮你设计好了角色控制器组件(Characters),你只需要导入它,然后就可以直接使用了。

    二、导入Unity自带的脚色控制器

    要让你设计的场景动起来,只需要导入Unity自带的Characters组件,如下图所示:

    image

    或者右击Project视图下的Assets文件夹,弹出的上下文菜单与上图相同。

    在接下来弹出的窗口中,直接单击【Import】即可:

    image

    三、Unity自带的角色控制器的分类

    Unity自带的脚色控制器有两种:第1人称和第3人称。

    1、第1人称

    Unity自带的第一人称预设(Prefabs)已经帮你实现了需要的常用功能,利用它你不用再编写任何脚本,只需要将此预设拖放到场景中就可以使用了。

    使用第一人称角色的步骤︰

    (1) 创建一个合适的场景,场景中提供可以四处走动的地面。

    (2) 将FirstPersonCharacter预设拖放到场景中。

    (3) 删除创建场景时自动添加的“Main Camera”。这是因为第一人称角色预置包含有自己的相机,所以添加FirstPersonCharacter后“Main Camera”已经没用了。

    第一人称角色由以下组件共同联合发起相关的动作:

    FirstPersonCharacter.cs文件中的脚本:移动(上下箭头键:前进、后退,左右箭头键:左右移动)、环视场景(左右移动鼠标)和跳跃(空格键)。

    SimpleMouseRotator.cs文件中的脚本:转身、站起和准备起跳。

    另外,Unity自带的第一人称角色还包括摇头晃脑特效(Head Bob,也叫鲍勃头)和走动时发出的脚步声(可选)。你可以根据需要决定是否使用这些特效。

    Unity自带的第一人称角色的每个脚本组件都提供了大量的可直接调整的设置,你要做的事很简单,只需要在检视器中改变这些值即可。例如修改移动速度、弹跳的能量、鲍勃头的摇晃形式、……等。

    还有,脚本中需要引用的"零摩擦阻力"(zero friction)和"最大摩擦阻力"(max friction)物理材质也都已经包含在内了,不需要你自己再去设计材质。

    2、第3人称

    后面的章节再介绍。

    四、示例(Demo05)

    本例子演示如何添加第1人称角色控制器到场景中。

    1、添加第1人称预设

    将Characters下的【FbsController】预制体拖放到层次视图中,如下图所示:

    image

    2、删除Main Camera

    删除创建场景时自动添加的【Main Camera】。

    3、修改第1人称参数

    image

    4、预览观察效果

    按播放按钮预览。

    预览时,既可以用鼠标移动,也可以用上下左右箭头键移动。

    按Esc键,然后用鼠标再次单击播放按钮,结束预览。

    展开全文
  • unity角色控制器简介

    千次阅读 2020-05-21 23:13:28
    用于应用到会动的游戏对象上,添加角色控制器后,会自动添加一个胶囊碰撞体 主要参数说明: Slope Limit:坡度限制 Step Offset:台阶高度 -Skin Width:皮肤厚度,控制双方渗入的深度,一般是Radius值的10% Min ...

    Character Controller

    用于应用到会动的游戏对象上,添加角色控制器后,会自动添加一个胶囊碰撞体

    主要参数说明:

    • Slope Limit:坡度限制

    • Step Offset:台阶高度

    • -Skin Width:皮肤厚度,控制双方渗入的深度,一般是Radius值的10%

    • Min Move Distance:最小移动距离,大多数情况下设置为0

    • Center、 Radius、 Height:胶囊碰撞体的中心、半径、高度

    移动的方法:

    • move:指定一个向量,完成移动

    • SimpleMove:会受到重力的影响而发生移动

    • 注意:使用 SimpleMove方法,当发生旋转后,坐标系发生变化,移动时需要设置本地坐标系的值this.gameObject.transform.forward

    • 如果需要模拟游戏对象受策略的影响,可以添加内置脚本中的 CharacterMotor到游戏对象上

    • 示例1:通过点击控制移动

      • 方法Vector33. ClampMagnitude(dest-src, speed):表示将向量转换成指定长度
    • 示例2:通过键盘控制移动

    • 注意:使用物理引擎控制的移动,都使用本地坐标系,包括 rigidbody、角色控制器

    用角色控制器来控制方块移动Demo:

    public class CCDemo : MonoBehaviour
    {
        //角色控制器
        private CharacterController cc;
        //速度
        private float speed;
    
        // Start is called before the first frame update
        void Start()
        {
            cc = GetComponent<CharacterController>();
            speed = 100f;
        }
    
        // Update is called once per frame
        void Update()
        {
            cc.SimpleMove(Vector3.forward * speed * Time.deltaTime * Input.GetAxisRaw("Horizontal"));
        }
    }
    
    

    效果如下:

    在这里插入图片描述

    展开全文
  • unity 角色控制器CharaterController脚本

    千次阅读 2018-07-17 11:55:25
    角色控制器是unity内置的一个人物控制脚本。适用于第一、第三人称中控制人物的一个组件,刚体的计算量比较大, 所以出现了CharacterController来代替刚体,做具体的人物控制 常用属性介绍 Slop Limit : 坡度的...
  • Open 3D Mannequin是开源3d角色和角色控制器 :warning: 该项目仅支持Godot 3.2及更高版本。 :right_arrow: 在和上关注我们,以获取免费的游戏创建教程,技巧和新闻! 获得我们的之一,以支持我们在自由软件方面的...
  • 角色控制器 (Character Controller)

    千次阅读 2019-05-24 07:53:04
    角色控制器 (Character Controller) 一、简介 角色控制器(Character Controller)主要用于对第三人称或第一人称游戏主角的控制。如果要创建类人角色,可使用角色控制器 (Character Controller)。这可以是第三人称游戏...
  • [Unity3D]最简单的最详细的第一人称角色控制器

    万次阅读 多人点赞 2020-11-18 21:20:11
    [Unity3D]最简单最详细的第一人称角色控制器 自学Unity3D有一段时间了,一直想弄一个第一人称角色控制器,网上还是有很多教程和资料,但感觉有很多教程和资料理解起来比较复杂,在这里我结合网上所学的知识自己写了...
  • Unity3D 角色控制器 Character Controller

    千次阅读 2019-08-28 18:11:19
    角色控制器组件介绍 【Slope Limite】爬坡角度限制(如图限制爬坡角度为10度,超过10度的斜坡无法前进) 【Step Offset】脚步长度限制 【Skin Width】和胶囊体相关,建议不用调0.001 【Min Move Distance】两个物体...
  • 这篇是简单介绍Unity的几个常见碰撞器、刚体、以及角色控制器、导航系统,大致内容转载来自这里。 碰撞器: Unity中存在这么几种碰撞器,可以检测物体与物体之间的碰撞,当游戏对象中的 Rigidbody 碰撞...
  • 角色控制器(CCT)SDK是一个构建在PhysX SDK基础之上的外部组件,拥有和PhysXExtensions类似的机制 CCT可以有多种实现方式:PhysX只实现其中一种。   从本质上讲,CCT通常是基于游戏定制化的,并且它们在每个...
  • unity 角色控制器,控制人物移动

    千次阅读 2018-03-28 19:48:37
    //获得键盘按键虚拟轴 HeroMove.z = Input.GetAxis("Vertical") * Speed * Time.deltaTime; HeroMove.x = Input.GetAxis("... //gyro为挂有陀螺仪脚本的对象,在这里只取他的Y轴,控制角色 ...
  • 角色控制器(CharacterController): 首先,角色控制器没有碰撞效果,这是和刚体的区别,不像刚体可以给其力 如果想使人物移动,直接复制官方文本中的CharacterController下的Move()方法,前台添加“Character...
  • 鼠标操作视角功能实现 1.创建一个空的物体(Create Empty)改名为Player, 添加一个胶囊体子物体, ...用来实现鼠标控制视角 。 变量 public Transform player;//胶囊体和摄像机的父物体 public float mouseSensitiv
  • Unity3D基础38:角色控制器组件

    千次阅读 2019-02-24 23:10:52
    一、CharacterController角色控制器 为什么使用角色控制器而不使用刚体?  → 刚体过于灵活(敏感),例如稍有碰撞就会被弹开,物体的质量不好把握或计算等等 角色控制器面板与属性: Slope Limit:控制角色...
  • UnityThirdPersonController 具有Unity动画的第三人称角色控制器
  • 通过此ppt可轻松学习如何在unity3d制作动画系统与角色控制器
  • untiy 2D角色控制器

    千次阅读 2016-07-04 23:40:19
    这里我用Prime31这个公司的插件改了一个比较小的控制脚本,博客结尾会给大家一份源码,先简单的讲一下2D人物控制器的原理,2D控制器可不像untiy 3D控制器那样,untiy官方帮我们封装了。所以这里就只能自己去写了,先...
  • Unity3d之角色控制器

    万次阅读 2016-04-10 13:51:27
    我们要控制角色的移动,可以全部细节都由自己来实现。控制角色模型的移动,同时移动摄影机,改变视角。当然Unity也提供了一些组件,可以让我们做更少的工作,实现我们所期望的功能。今天我们就一起系统来学习相关的...
  • Unity 第三人称角色控制器

    千次阅读 2018-05-13 00:25:23
    这个第三人称角色控制器目前只写了PC端 using UnityEngine; using System.Collections; public class CameraFollow : MonoBehaviour { //距离 public float distance = 8; //横向角度 public float ...
  • 首先给游戏物体添加CharacterController组件 编写脚本,将脚本挂在游戏物体上 通过 GetComponent<CharacterController>(); 获取CharacterController组件 该组件有两个移动的方法Move和SimpleMove ......
  • 整理截图自官方视频教程,unity2D角色控制器教程(基于untiy5修改)
  • unity3d-代码控制游戏角色控制器移动

    千次阅读 2016-11-04 09:33:36
    先上一个gif看看效果。因为图片大小限制。... 1:摄像机跟着角色移动,上篇博客说的是。把摄像机变成角色的子对象。发现没有我想要的效果。跟着角色移动代码是我自己弄出来的。不知道实际项目中是否也是这样。
  • 今天会谈到角色控制器和刚体主要是为了做一个游戏人物的控制器,角色控制器和刚体各有各的优点。 首先说一下刚体吧,刚体这个组件可以说是做一些真是物理游戏的开发者的福音,只要你给物体加上刚体基本可以算是给它...
  • Unity角色控制器CharacterController的简单介绍

    万次阅读 多人点赞 2018-01-23 14:43:26
    角色控制器(CharacterController): 首先,角色控制器没有碰撞效果,这是和刚体的区别,不像刚体可以给其力 如果想使人物移动,直接复制官方文本中的CharacterController下的Move()方法,前台添加“Character...
  • //cube:克隆对象、hit.point:克隆的位置、Quaternion.identity:不旋转 } } 二、角色控制器 第一人称:在第一人称视角游戏中,整个游戏视图好比主角的眼睛,游戏画面中的一切好像是从自己眼睛看到的一样 第三...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 225,433
精华内容 90,173
关键字:

角色控制器