如何以纸板方向移动播放器?

时间:2016-09-22 09:00:18

标签: android unity3d

我已在我的Unity项目中设置了google vr sdk,它可以完美地移动相机。但是我如何使用vr方向控制播放器呢? 例如,当我向左或向右转头时,玩家向左或向右移动。

在我的代码中,我只知道从键盘输入:

float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, moveVertical + motion_cont.getVertical(), 1f);
rb.velocity = movement * motion_cont.getSpeed();

1 个答案:

答案 0 :(得分:0)

这是我经常使用的脚本,可以朝着相机的方向移动播放器。它使用纸板磁铁按钮触发行走。您可以将其更改为您想要的任何内容。

// This script moves your player automatically in the direction he is looking at. You can 
// activate the autowalk function by pull the cardboard trigger, by define a threshold angle 
// or combine both by selecting both of these options.
// The threshold is an value in degree between 0° and 90°. So for example the threshold is 
// 30°, the player will move when he is looking 31° down to the bottom and he will not move 
// when the player is looking 29° down to the bottom. This script can easally be configured
// in the Unity Inspector.Attach this Script to your CardboardMain-GameObject. If you 
// haven't the Cardboard Unity SDK, download it from https://developers.google.com/cardboard/unity/download

using UnityEngine;
using System.Collections;

public class Autowalk : MonoBehaviour 
{
    private const int RIGHT_ANGLE = 90; 

    // This variable determinates if the player will move or not 
    private bool isWalking = false;

    CardboardHead head = null;

    //This is the variable for the player speed
    [Tooltip("With this speed the player will move.")]
    public float speed;

    [Tooltip("Activate this checkbox if the player shall move when the Cardboard trigger is pulled.")]
    public bool walkWhenTriggered;

    [Tooltip("Activate this checkbox if the player shall move when he looks below the threshold.")]
    public bool walkWhenLookDown;

    [Tooltip("This has to be an angle from 0° to 90°")]
    public double thresholdAngle;

    [Tooltip("Activate this Checkbox if you want to freeze the y-coordiante for the player. " +
             "For example in the case of you have no collider attached to your CardboardMain-GameObject" +
             "and you want to stay in a fixed level.")]
    public bool freezeYPosition; 

    [Tooltip("This is the fixed y-coordinate.")]
    public float yOffset;

    void Start () 
    {
        head = Camera.main.GetComponent<StereoController>().Head;
    }

    void Update () 
    {
        // Walk when the Cardboard Trigger is used 
        if (walkWhenTriggered && !walkWhenLookDown && !isWalking && Cardboard.SDK.Triggered) 
        {
            isWalking = true;
        } 
        else if (walkWhenTriggered && !walkWhenLookDown && isWalking && Cardboard.SDK.Triggered) 
        {
            isWalking = false;
        }

        // Walk when player looks below the threshold angle 
        if (walkWhenLookDown && !walkWhenTriggered && !isWalking &&  
            head.transform.eulerAngles.x >= thresholdAngle && 
            head.transform.eulerAngles.x <= RIGHT_ANGLE) 
        {
            isWalking = true;
        } 
        else if (walkWhenLookDown && !walkWhenTriggered && isWalking && 
                 (head.transform.eulerAngles.x <= thresholdAngle ||
                 head.transform.eulerAngles.x >= RIGHT_ANGLE)) 
        {
            isWalking = false;
        }

        // Walk when the Cardboard trigger is used and the player looks down below the threshold angle
        if (walkWhenLookDown && walkWhenTriggered && !isWalking &&  
            head.transform.eulerAngles.x >= thresholdAngle && 
            Cardboard.SDK.Triggered &&
            head.transform.eulerAngles.x <= RIGHT_ANGLE) 
        {
            isWalking = true;
        } 
        else if (walkWhenLookDown && walkWhenTriggered && isWalking && 
                 head.transform.eulerAngles.x >= thresholdAngle &&
                 (Cardboard.SDK.Triggered || 
                 head.transform.eulerAngles.x >= RIGHT_ANGLE)) 
        {
            isWalking = false;
        }

        if (isWalking) 
        {
            Vector3 direction = new Vector3(head.transform.forward.x, 0, head.transform.forward.z).normalized * speed * Time.deltaTime;
            Quaternion rotation = Quaternion.Euler(new Vector3(0, -transform.rotation.eulerAngles.y, 0));
            transform.Translate(rotation * direction);
        }

        if(freezeYPosition)
        {
            transform.position = new Vector3(transform.position.x, yOffset, transform.position.z);
        }
    }
}

来源:JuppOtto/Google-Cardboard