Unity 原神人物移动和镜头处理

这篇具有很好参考价值的文章主要介绍了Unity 原神人物移动和镜头处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

每帧都处理的地方 不要用 SetTrigger
为什么呢?
你肯定会希望 SetTrigger run 就跑步 SetTrigger stop 就停止
但事实并非如此
SetTrigger 会在下一帧自动设置回去
而你移动肯定是每帧都在 SetTrigger 所以人物移动会抽搐
最好的办法是 设置float

分析原神的镜头
界面左侧负责控制人物移动
界面右侧负责控制视角
人物的移动方向 和 人物朝向没有关系。只和镜头方向有关系。

v.x = this.joystick.Horizontal;
v.z = this.joystick.Vertical;
if (v.x == 0 && v.z == 0)
{
    this.animator.SetFloat("runfloat", 0.0f);
    return;
}
else
{
    this.animator.SetFloat("runfloat", 0.2f);
}
Vector3 startV3 = new Vector3(this.freeLook.transform.position.x, 0, this.freeLook.transform.position.z);
Vector3 endV3 = new Vector3(this.transform.position.x, 0, this.transform.position.z);
Vector3 n = (endV3 - startV3).normalized;
镜头到角色的方向
this.transform.forward = n;
临时让人物朝向这个方向,方便后面计算
Vector3 v3 = this.transform.forward * v.z + this.transform.right * v.x;
前方向 * 摇杆的 y + 右方向 * 摇杆的 x
this.transform.LookAt(this.transform.position + v3);
this.transform.position += v3 * 0.03f;

右边的镜头用的是freelook镜头
ps.本来想计算角度啥的
后来志神提醒一下就解决了 感谢志神!

一点优化小细节
Vector3.sqrMagnitude 是指长度的平方,也就是Vector3.magnitude的平方

计算向量大小的平方会比计算向量的大小要快很多,因为向量的大小由勾股定理得出,所以有开方操作,如果只是单纯的比较两个向量的大小,可以使用sqrMagnitude会快很多。

镜头让障碍物挡住了咋整?
unity 移动端镜头控制,游戏开发,unity,游戏引擎
添加一个这个
unity 移动端镜头控制,游戏开发,unity,游戏引擎
这三个就是遇到障碍物 不同的处理方式

第一个 就是简单的把 镜头移动到障碍物前面 向着镜头的 Forward 方向移动
第二个 是保持镜头高度 也就是说 距离障碍物越近 人物变的越大
第三个 保持镜头距离 但是会改变角度 相当于把摄像头挤上去了

可以看这个地方
https://cloud.tencent.com/developer/article/2080742
总之非常重要的功能

如果左右移动 你会发现 角色是绕圈的
因为你的移动方向和镜头是90度 相当于画圈了

可以参考下这个
unity 移动端镜头控制,游戏开发,unity,游戏引擎
Lock To Target On Assign:本地空间,相机被激活或target赋值时的相对位置。
Lock To Target With World Up:本地空间,保持相机y轴朝上,yaw和roll为0。
Lock To Target No Roll:本地空间,锁定到目标物体,roll为0。
Lock To Target:本地空间,锁定到目标物体
World Space:世界空间
Simple Follow With World Up:相对于目标的位置,使用相机的本地坐标系,保持相机y轴朝上

获得组件用 GetCinemachineComponent

这个插件还有一个例子可以学习下
unity 移动端镜头控制,游戏开发,unity,游戏引擎

仔细观察
原神双指捏合 可以控制镜头
怎么办
非常简单
控制freelook镜头的地方 判断下 如果是两指就不滑动屏幕了

if (JoyCube.Use.UpdateAndGetFingers().Count == 2)
{
    return;
}

下面是动态改变
unity 移动端镜头控制,游戏开发,unity,游戏引擎

var fingers = Use.UpdateAndGetFingers();
Cinemachine.CinemachineFreeLook.Orbit o = this.freeLook.m_Orbits[1];
o.m_Radius *= Lean.Touch.LeanGesture.GetPinchScale(fingers);  
Cinemachine.CinemachineFreeLook.Orbit o1 = new Cinemachine.CinemachineFreeLook.Orbit(o.m_Height, o.m_Radius);
this.freeLook.m_Orbits[1] = o1;

直接改属性是不行的 需要创建新的 Orbit 并赋值回去 不然不起作用
好 现在就实现了原神的基本镜头了

对了 捏合状态用的插件是 Lean Touch
非常方便的插件
判断捏合只需要几句话

public static Lean.Touch.LeanFingerFilter Use = new Lean.Touch.LeanFingerFilter(true);
var fingers = Use.UpdateAndGetFingers();
LeanGesture.GetPinchScale(fingers)

滑动屏幕大概是这样的 (草稿)

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

public class TouchTest : MonoBehaviour
{
    public Cinemachine.CinemachineFreeLook look;
    private bool drag = false;
    private float startY = 0;
    // Update is called once per frame
    private float lastx = 0;
    private float lasty = 0;

    void Update()
    {
        if (JoyCube.Use.UpdateAndGetFingers().Count == 2)
        {
            return;
        }
 
        if (this.isClick())
        {
            this.drag = true;
            this.startY = look.m_YAxis.Value;
            this.lasty = Input.mousePosition.y;
            this.lastx = Input.mousePosition.x / Screen.width;
        }
        if (Input.GetMouseButtonUp(0))
        {
            this.drag = false;
        }
        if (this.drag)
        {
            float pery = (this.lasty - Input.mousePosition.y) / Screen.height;
            look.m_YAxis.Value = this.startY + pery;
            float perx = Input.mousePosition.x / Screen.width;
            look.m_XAxis.Value = -360.0f * (this.lastx - perx);
            this.lastx = perx;
        }
    }

    private bool isClick()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())
            {
                // Debug.Log("点到了ui");
                return false;
            }
            return true;
        }
        if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
        {
            if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
            {
                Debug.Log("Touched the UI");
            }
        }
        return false;
    }
}

unity 移动端镜头控制,游戏开发,unity,游戏引擎
Damping 是干啥的呢
这是控制镜头恢复的速度
如果是0 那么镜头就立即移动
数值越大 镜头恢复越慢

unity 移动端镜头控制,游戏开发,unity,游戏引擎

unity 移动端镜头控制,游戏开发,unity,游戏引擎
这个是控制镜头偏移的 好像越肩视角用这个

unity 移动端镜头控制,游戏开发,unity,游戏引擎
镜头阻尼

选择这个会显示辅助线
unity 移动端镜头控制,游戏开发,unity,游戏引擎
unity 移动端镜头控制,游戏开发,unity,游戏引擎
但是 你必须展开 Aim , 不然他不会起作用。

unity 移动端镜头控制,游戏开发,unity,游戏引擎
细心的你 一定会发现 X Axis 的 value 永远是0
原神那种 一上来 角度固定在后背的 根本做不到
这是为啥呢?
unity 移动端镜头控制,游戏开发,unity,游戏引擎
官方给出了答案

unity 移动端镜头控制,游戏开发,unity,游戏引擎
就是你的binding mode 需要换一下

你会发现 上面的界面改变了
unity 移动端镜头控制,游戏开发,unity,游戏引擎
这样你就可以设置value了

还有一个功能 需要一键回归角度
unity 移动端镜头控制,游戏开发,unity,游戏引擎

y的value 非常有意思
0就是bottom 0.5就是middle 1就是top
和你设置的height没关系
你middle再高 也是0.5
unity 移动端镜头控制,游戏开发,unity,游戏引擎
推荐一个林大的博客
https://blog.csdn.net/linxinfa/article/details/124537415
无敌了

一般用 unity 移动端镜头控制,游戏开发,unity,游戏引擎
然后这个有一个特点 就是一开始镜头的位置是相对固定的
所以一开始的时候 要让player的rotation是0
这样 look free的 m_XAxis 的 0 和 rotation的0 是 同样的方向
方便我们后面做reset镜头文章来源地址https://www.toymoban.com/news/detail-726722.html

到了这里,关于Unity 原神人物移动和镜头处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Unity 通过鼠标控制模拟人物移动和旋转视角

    要通过鼠标控制并模拟人物移动和转换视角,将会使用射线检测、鼠标点击和鼠标水平移动,配合物体旋转和移动方法共同实现。 首先搭建个由一个Plane地板和若干cube组成的简单场景: 其次创建一个Capsule作为移动物体,并把摄像头拉到该物体中。 创建以下脚本:  把脚本拉

    2024年02月03日
    浏览(30)
  • Unity教程3:使用BlendTree控制人物移动动画切换

    目录 创建动画文件 移动动画逻辑以及BlendTree的使用方法  创建移动变量 了解并使用混合树 实现保持移动方向的动画切换 手册链接在这:Unity User Manual (2019.3) - Unity 手册 实现了基本的人物移动代码后,为了使得我们的人物更加的生动有趣,我们还需要实现人物的动画效果。

    2024年02月13日
    浏览(31)
  • unity通过脚本实现漫游功能 wasd控制玩家移动,空格跳跃,鼠标控制视野旋转,滑轮控制镜头伸缩

    将场景中的摄像机删除,在玩家的控制面板中添加Camera组件,和rigibody组件   using System.Collections; using System.Collections.Generic; using UnityEngine; public class move : MonoBehaviour {     public float speed;     Rigidbody rigid;     void Start()     {                 rigid = GetComponentRigidbody();     }  

    2024年02月10日
    浏览(33)
  • 【Unity小技巧】3D人物移动脚步和跳跃下落音效控制

    获取人物移动状态 脚步声控制 解释: go 的这个逻辑保证了只有在需要重新设置音频剪辑时才会执行,避免了声音的混叠和中断。如果去除这个逻辑,可能会导致声音播放不正常。 AS.pitch是用来控制音频的音调(pitch)的属性。该属性控制音频的播放速度,1.0 表示正常速度,

    2024年01月22日
    浏览(33)
  • Unity3D方向键控制人物移动的代码

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

    2024年02月11日
    浏览(42)
  • Unity 导入原神人物模型

    原神人物模型官方下载地址: 一、https://ys.biligame.com/gczj/ 二、《原神》迫近的客星视频征集计划 三、《原神》「白垩与黑龙」1.2版本视频征集计划 四、 《原神》「明霄升海平」1.3版本视频征集计划 五、原神1.5版本UP主激励计划 六、原神1.6版本UP主激励计划 七、原神2.0版本

    2024年02月05日
    浏览(79)
  • Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

    目录 人物的创建以及刚体的设置 图层渲染层级设置 角色碰撞箱设置 使用代码控制人物移动 创建脚本文件  初始函数解释 控制移动代码 初始化变量  获得键盘输入  调用函数 手册链接在这:Unity User Manual (2019.3) - Unity 手册 没有控制人物移动的2D游戏就太说不过去了!那么接

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

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

    2024年04月27日
    浏览(41)
  • Unity SteamVR 开发教程:用摇杆/触摸板控制人物持续移动(2.x 以上版本)

    持续移动是 VR 开发中的一个常用功能。一般是用户推动手柄摇杆,或者触摸手柄触摸板,来控制人物持续地移动。Unity SteamVR 插件中只提供了传送的移动功能,而没有用摇杆或触摸板控制人物持续移动的功能。因此,持续移动的功能需要我们自己开发。 使用的 Unity 版本:

    2024年02月08日
    浏览(61)
  • 【unity造车轮】3种实现虚拟移动摇杆控制人物移动的方法(实操加详细讲解,全网最全最易理解)

    素材 继承ScrollRect,自己手戳代码,我愿意称之为最简单的实现

    2024年02月14日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包