玩家控制相对于玩家对象的次要对象

本文关键字:玩家 对象 控制 相对于 | 更新日期: 2023-09-27 18:09:48

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

我想要的是控制一个游戏对象,它围绕玩家对象以固定的距离旋转,基于右模拟摇杆输入,独立于玩家的移动。我还希望物体在玩家周围移动时面朝外。

我已将左侧模拟摇杆设置为玩家移动和工作,并设置并测试了右侧模拟摇杆,因此我知道输入是有效的。

我试过变换。旋转,rotataround, .position和四元数等,但不能弄清楚或找到任何可能有帮助的东西。我对此相当陌生,所以可能有一个简单的解决方案,我只是看不出来!

感谢您可能能够给予的任何帮助:)谢谢您。

EDIT 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和slps,到目前为止,我所能做的就是从圆周上的一点直线插入到新的点。如果你只是旋转摇杆,我想不出有什么方法可以让它围绕玩家旋转。希望这能说得通!

你有什么好主意吗?

玩家控制相对于玩家对象的次要对象

这里有两种方法来完成你想要的

请注意:这还没有测试过

使用自定义的规范化过程 (0f正是Vector3.forward, 1f将您带回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);
    }
}

With 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);
    }
}