当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 第一人称视角移动问题

第一人称视角移动问题 时间:2017-11-07      来源:未知

Unity3D作为目前比较火的游戏引擎,其在游戏移动端的市场范围是非常大的。虽然其渲染能力以及效率有待提高,但是不妨碍它的强大优势。并且在2016年VR元年的确定下,它对市场绝大多数VR设备开发的支持使其越来越受到人们的欢迎。

在VR开发中,第一人称的移动始终是至关重要的一项。无论是角色的速度、动作幅度的摇摆、人物的动作姿态等等,都是开发者需要谨慎对待的部分。接下来我和大家说下在VR中移动容易出现的一些问题。

由于公司在开发VR项目的时候没有考虑到的多设备支持,并没有用到市场上相关的SDK,而是使用Unity中Camera的属性制作了简易的VR摄像机。制作部分如下:

首先创建一个空物体并命名为VRCamera,用来作为两个摄像机的父物体,并将VRCamera物体的Transform组件初始化。方便对VR摄像机的操作。

然后选中VRCamera物体,然后创建出两个摄像机,分别命名为LeftCamera和RightCamera。作为VRCamera的子物体。

然后将其中任意一个Camera上的Audio Listener组件单击右键选择Remove Component移除掉(只移除一个)。

将Main Camera摄像机Transform归0。将其拖到VRCamera下作为其子物体。并将Depth设置为-1。

将LeftCamera摄像机参数修改为下图所示。

将RightCamera摄像机参数修改为下图所示。

修改完之后,创建一个Cube调整其位置便于观察,在Game视图下的场景如下图所示。

然后在VRCamera上添加碰撞体和刚体进行人物的模拟,并且在其身上挂在移动的脚本。正常情况下是挂在的接受手机陀螺仪数据的脚本。如果使用普通的移动方式,例如:

对其位置进行增减transrorm.position += 或者-=,或者使用transfrom.Translate方法此时均会产生低头的时候会穿破地面,抬头的时候会离开地面。或者干脆就停止不动。

遇到这种问题的时候,当物体带有刚体,需要对物体进行移动的时候,好的办法是对其刚体组件进行操作,使用如下方法:

Rigidbody.MovePosition(transform.position +=/-= ...);

而其移动的方向是:

Vector3 dir = new Vector3(Camera.main.transform.forward.x, 0,Camera.main.transform.forward.z);

这样就能保证当地头的时候,向前移动会低着头向前走,而不是穿破地面,抬头的时候是抬头向前走,而不是离开地面。

下面是我做的一个模拟:

创建工程,然后在Inspector面板中创建物体Plane作为地面。

然后继续在Inspector面板中创建子物体Capsule模拟人物模型,并调节Capsule物体的高度,使其底部处于Plane物体上。

在Project中创建Material,并填充颜色,将该材质球赋值给Plane,以作区别。

在Project面板中创建脚本Move.cs,用来实现物体的移动和旋转。按下“W”或者“↑”是向前走,按下“S”或者“↓”是向后走。移动鼠标是旋转,然后将该脚本挂载在Capsule物体上。

脚本如下: 

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;

 

public class Move : MonoBehaviour

{

    #region 变量

    /// <summary>

    /// 刚体

    /// </summary>

    private Rigidbody rigid;

 

    /// <summary>

    /// 移动的速度

    /// </summary>

    private float walkSpeed = 0.05f;

 

    /// <summary>

    /// 移动的方向

    /// </summary>

    private float moveDir;

 

    /// <summary>

    /// 旋转的方向

    /// </summary>

    private float rotateDir;

 

    /// <summary>

    /// 旋转速度

    /// </summary>

    private float rotateSpeed = 30f;

    #endregion

    #region Unity 方法

 

    private void Awake()

    {

        // 初始化刚体组件

        rigid = transform.GetComponent<Rigidbody>();

    }

    private void Update()

    {

        moveDir = Input.GetAxis("Vertical");

        rotateDir = Input.GetAxis("Mouse X");

        if (rotateDir != 0)

        {

         transform.Rotate

            (Vector3.up * rotateDir * Time.deltaTime * rotateSpeed);

        }

        if (moveDir > 0)

        {

            // 向前走

            MoveForward();

        }

        else if(moveDir < 0)

        {

            // 向后走

            MoveBack();

        }

    }

 

    #endregion

    #region 具体实现的方法

    /// <summary>

    /// 向前走

    /// </summary>

    /// <param name = "speed">移动的速度</param>

    /// <param name="fixedTime">固定更新的时间</param>

    void MoveForward()

    {

        // 移动的方向,y轴不变

        Vector3 dir = new Vector3(Camera.main.transform.forward.x, 

            0,

            Camera.main.transform.forward.z);

        // 移动

        rigid.MovePosition(transform.position + dir * walkSpeed);

    }

 

    /// <summary>

    /// 向后走

    /// </summary>

    /// <param name="speed">移动的速度</param>

    /// <param name="fixedTime">固定更新时间</param>

    void MoveBack()

    {

        // 移动的方向,y轴不变

        Vector3 dir = new Vector3(Camera.main.transform.forward.x,

             0,

             Camera.main.transform.forward.z);

        // 移动

        rigid.MovePosition(transform.position - dir * walkSpeed);

    }

    #endregion

}

 

然后在Capsule物体上添加Rigidbody组件,并调整参数。

做到这一步骤,Capsule已经可以移动旋转了。接下来做第一人称的实现,将Inspector面板中的Main Camera,然后修改其位置和Capsule位置一致,并将Main Camera拖动为Capsule的子物体。

然后在Inspector面板中床架Cube并随意修改其位置作为参照物。然后点击运行,可以实现第一人称的移动旋转等操作。

同样的设置设置在VRCamera物体上一样可以实现该操作。

上一篇:NOR FLASH和NAND FLASH

下一篇:IIC裸机开发过程

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部