unity3D实现父随子动效果,SteamVR手柄触摸板移动的简单解决方案
在我们做项目的时候是否会遇到需要父物体跟随子物体移动的情况呢,比如我们的子物体是摄像机,而父物体需要随着我们摄像机的视角移动,如果只是简单的将子物体的旋转赋值给父物体,父物体会一直追赶子物体的旋转,但是父物体旋转后子物体会跟随着父物体旋转,两个物体便会无限的旋转下去,那要如何解决呢?
首先,我们的目的是像fps组件一样父物体跟随子物体的朝向走,但是我并不会让父物体旋转,我的做法是在父子之外新建一个空物体,将其位置与父物体重合,我们将摄像机的旋转传给这个空物体,然后用按键控制空物体移动,他会跟随我的朝向前进,之后,我们将这个空物体的位置传给父物体,这样我们的父物体就会跟随我们的朝向前进了。
代码:
//本代码挂在我们的子物体(摄像机)上。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {
// Use this for initialization
public GameObject fu;//父物体
public GameObject weizhi;//空物体“位置”
public float speed;//速度
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetKey(KeyCode.W))//按键控制“位置”前进
{
weizhi.GetComponent<Transform>().Translate(Vector3.forward * speed * Time.deltaTime, Space.Self);
}
if (Input.GetKey(KeyCode.S))//按键控制“位置”后退
{
weizhi.GetComponent<Transform>().Translate(Vector3.forward * -1 * speed * Time.deltaTime, Space.Self);
}
//子物体的旋转模拟VR摄像机的旋转,实际运用不许要写
if (Input.GetKey(KeyCode.A))//子物体的左旋转
{
this.GetComponent<Transform>().Rotate(Vector3.up * -1 * 100 * Time.deltaTime);
}
if (Input.GetKey(KeyCode.D))//子物体的右旋转
{
this.GetComponent<Transform>().Rotate(Vector3.up *100 * Time.deltaTime);
}
fu.GetComponent<Transform>().position = weizhi.GetComponent<Transform>().position;//实时更新父物体位置等于空物体位置
Quaternion temp = new Quaternion(0, this.GetComponent<Transform>().rotation.y, 0, 1);//定义四元数使我们的空物体仅左右旋转,也就是绕y轴旋转
weizhi.GetComponent<Transform>().rotation = temp;//更新空物体朝向
//weizhi.GetComponent<Transform>().rotation=this.GetComponent<Transform>().rotation;不用四元数限制则会让空物体的朝向完全等于我们的摄像头,上下也是,所以我们的移动会上天,所以需要用四元数老进行限制。
}
}
此文档仅个人学习,仅供参考,如有不足请指出。