Unity 5.1播放器控制次要对象相对于玩家对象

时间:2015-08-26 09:22:08

标签: c# unity3d rotation relative

我已经做了很多搜索,但找不到解决这个问题的方法。

我想要的是根据右侧模拟杆输入控制围绕玩家对象旋转的游戏对象,独立于玩家移动。我还希望物体在玩家周围移动时向外朝向。

我已将模拟手柄设置为播放器移动和工作,并设置并测试了正确的模拟棒,因此我知道输入正在工作。

我尝试过transform.rotate,RotateAround,.position和quaternions等,但无法弄明白或找到任何可能有用的东西。我对此很新,所以可能有一个简单的解决方案,我只是看不到它!

感谢您提供的任何帮助:)谢谢你们。

编辑2:第二次尝试

所以到目前为止我已经有了这个:

public class ShieldMovement : MonoBehaviour {

public Transform target; //player shield is attaced to

float distance = 0.8f; // distance from player so it doesn't clip
Vector3 direction = Vector3.up;


// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

    float angle = Mathf.Atan2 (Input.GetAxisRaw("rightH"), Input.GetAxisRaw("rightV"))* Mathf.Rad2Deg;

    if(Input.GetAxis("rightH") != 0f || Input.GetAxis("rightV") != 0f)
    {
        direction =  new Vector3(Input.GetAxis("rightH"),Input.GetAxis("rightV"), 0.0f ) ;
    }

    Ray ray = new Ray(target.position, direction);
    transform.position = ray.GetPoint(distance);

    if(Input.GetAxis("rightH") != 0f || Input.GetAxis("rightV") != 0f)
    {
        transform.rotation = Quaternion.AngleAxis(angle,Vector3.forward*-1);
    }


}

}

我希望这是一个平稳的旋转盾牌围绕玩家去一个新的位置,而不是传送到那里。我已经尝试了一些lerps和一些slerps,到目前为止我所能做的所有内容都是从圆周上的一个点直接插入到新点。如果只是旋转操纵杆,就无法想到让它围绕播放器旋转的方法。希望有意义!

你有什么好主意吗?

1 个答案:

答案 0 :(得分:0)

有两种方法可以实现你想要的东西

请注意:尚未经过测试

使用自定义规范化游行0f正好是Vector3.forward1f会将您带回Vector3.forward

using UnityEngine;
using System.Collections;

public class Follower : MonoBehaviour {

    float distance = 10f;
    Vector3 direction = Vector3.forward;
    float procession = 0f; // exactly at world forward 0
    Transform target;

    void Update() {
        float circumference = 2 * Mathf.PI * distance;
        angle = (procession % 1f) * circumference;
        direction *= Quaternion.AngleAxis(Mathf.Rad2Deg * angle, Vector3.up);
        Ray ray = new Ray(target.position, direction);

        transform.position = ray.GetPoint(distance);
        transform.LookAt(target);
    }
}

使用Input.GetAxis

using UnityEngine;
using System.Collections;

public class Follower : MonoBehaviour {

    float distance = 10f;
    Vector3 direction = Vector3.forward;
    float speed = .01f;
    Transform target;

    void Update() {
        direction *= Quaternion.AngleAxis(Input.GetAxis("Horizontal") * speed * Time.deltaTime, Vector3.up);
        Ray ray = new Ray(target.position, direction);

        transform.position = ray.GetPoint(distance);
        transform.LookAt(target);
    }
}