玩家控制相对于玩家对象的次要对象
本文关键字:玩家 对象 控制 相对于 | 更新日期: 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);
}
}