Unity3D:结合 FPS 控制器和陀螺仪相机的问题

Posted

技术标签:

【中文标题】Unity3D:结合 FPS 控制器和陀螺仪相机的问题【英文标题】:Unity3D: Issues on combining FPS Controller and gyroscope camera 【发布时间】:2016-04-24 19:08:29 【问题描述】:

所以我正在尝试使用 Unity 5 FPS 控制器做一些不同的事情,并将我从这里 (http://forum.unity3d.com/threads/sharing-gyroscope-camera-script-ios-tested.241825/) 获得的陀螺仪相机脚本附加到 FirstPersonCharacter 相机(在注释掉 FirstPersonController 中所有与 mouselook 相关的代码之后) 。CS)。到目前为止,FirstPersonCharacter 根据手机的动作四处张望,但当玩家开始移动时会出现问题。

玩家(FPSController)和相机(FirstPersonCharacter)的移动是断开的,玩家移动和扫射与FirstPersonCharacter的变换无关。这是因为只有 FirstPersonCharacter 的变换受陀螺控制,而不是 FPSController。

我尝试通过依次向 FirstPersonController.cs 添加控件来进行修复,其中 FPSController 仅沿 y 轴旋转,这有效,但仅适用于父 FPSController。当 FPSController 转动时,它会搞砸 FirstPersonCharacter,导致它在直视时滚动,在向上或向下看时偏航,在向一侧看时俯仰。

我希望改变父母会影响孩子的行为,确实如此,但只是以一种可怕的方式。任何人都有解决此问题的解决方案或想法?

【问题讨论】:

从这里看起来像是一个本地/世界旋转问题。您能否提供一些代码并描述您在场景中的层次结构? FirstPersonController.cs 的代码是您从 Unity 的标准资产中获得的未经编辑的副本,除了添加了几个函数以允许转动播放器。至于我的对象的层次结构,FPSController 是 FirstPersonCharacter 的父级,它只沿 y 轴旋转。然而,由于陀螺运动的性质,FirstPersonCharacter 沿每个轴旋转。 另外,我忘了提到相机怪异只有当我将上述陀螺仪相机脚本中的transform.rotation = Input.gyro.attitude;更改为:transform.localRotation = Input.gyro.attitude; 当使用 transform.rotation 时,相机似乎试图与玩家一起转动,但陀螺仪控件似乎覆盖了它试图做的任何旋转变化,并将其重置为初始旋转.喜欢。当身体转动时,头部一直向下并沿着同一轴线向下看。所以我使用 localRotaton 希望它会考虑父对象的旋转,但这只会让事情变得更糟。 【参考方案1】:

对于我的播放器控制器,我总是使用以下代码:

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

[RequireComponent(typeof(CharacterController))]

public class SC_FPSController : MonoBehaviour

    public float walkingSpeed = 7.5f;
    public float runningSpeed = 11.5f;
    public float jumpSpeed = 8.0f;
    public float gravity = 20.0f;
    public Camera playerCamera;
    public float lookSpeed = 2.0f;
    public float lookXLimit = 45.0f;

    CharacterController characterController;
    Vector3 moveDirection = Vector3.zero;
    float rotationX = 0;

    [HideInInspector]
    public bool canMove = true;

    void Start()
    
        characterController = GetComponent<CharacterController>();

        // Lock cursor
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    

    void Update()
    
        // We are grounded, so recalculate move direction based on axes
        Vector3 forward = transform.TransformDirection(Vector3.forward);
        Vector3 right = transform.TransformDirection(Vector3.right);
        // Press Left Shift to run
        bool isRunning = Input.GetKey(KeyCode.LeftShift);
        float curSpeedX = canMove ? (isRunning ? runningSpeed : walkingSpeed) * Input.GetAxis("Vertical") : 0;
        float curSpeedY = canMove ? (isRunning ? runningSpeed : walkingSpeed) * Input.GetAxis("Horizontal") : 0;
        float movementDirectionY = moveDirection.y;
        moveDirection = (forward * curSpeedX) + (right * curSpeedY);

        if (Input.GetButton("Jump") && canMove && characterController.isGrounded)
        
            moveDirection.y = jumpSpeed;
        
        else
        
            moveDirection.y = movementDirectionY;
        

        // Apply gravity. Gravity is multiplied by deltaTime twice (once here, and once below
        // when the moveDirection is multiplied by deltaTime). This is because gravity should be applied
        // as an acceleration (ms^-2)
        if (!characterController.isGrounded)
        
            moveDirection.y -= gravity * Time.deltaTime;
        

        // Move the controller
        characterController.Move(moveDirection * Time.deltaTime);

        // Player and Camera rotation
        if (canMove)
        
            rotationX += -Input.GetAxis("Mouse Y") * lookSpeed;
            rotationX = Mathf.Clamp(rotationX, -lookXLimit, lookXLimit);
            playerCamera.transform.localRotation = Quaternion.Euler(rotationX, 0, 0);
            transform.rotation *= Quaternion.Euler(0, Input.GetAxis("Mouse X") * lookSpeed, 0);
        
    

如果你想用播放器移动相机,你必须把相机作为播放器的子文件夹。

希望能帮到你!

【讨论】:

以上是关于Unity3D:结合 FPS 控制器和陀螺仪相机的问题的主要内容,如果未能解决你的问题,请参考以下文章

unity实用技能unity3d 陀螺仪控制camera移动旋转

unity3d 安卓陀螺仪控制 中心点按钮读秒确认问题

ARCore使用什么传感器?

(UNITY3d android 游戏)当我不触摸屏幕时,我的 fps 比我触摸时低

FPS 角色全身或手 Unity 3d

Unity3D中手机陀螺仪的使用