using UnityEngine;
using System.Collections;
public class PlayerVR : MonoBehaviour
{
protected Transform _transform;
private Transform _foot;
public static PlayerVR Instance;
private Transform _leftHand;
private Transform _rightHand;
private SteamVR_TrackedObject _leftTrackedObj;
private SteamVR_TrackedObject _rightTrackedObj;
public Transform _leftModel;
public Transform _rightModel;
public SteamVR_Controller.Device leftDevice;
public SteamVR_Controller.Device rightDevice;
private LineRenderer _lineRendererLeft;
private LineRenderer _lineRendererRight;
//射线
private Ray rayLeft { get { return new Ray(_leftModel.position, _leftModel.forward); } }
private Ray rayRight { get { return new Ray(_rightModel.position, _rightModel.forward); } }
private RaycastHit _leftHit;
private RaycastHit _rightHit;
//脚的朝向
public float lastAngle;
public float currentAngle;
public Quaternion initQ;
public Quaternion resultQ;
public void Start()
{
Instance = this;
//也就是[CameraRig]
_transform = GameObject.Find("PlayerVR").transform;
_foot = GameObject.Find("Foot").transform;
_foot.position = new Vector3(1000, 1000, 1000);
_leftHand = _transform.FindChild("LeftHand").transform;//获取物体
_rightHand = _transform.FindChild("RightHand").transform;
_leftModel = _transform.FindChild("LeftHand/left").transform;
_rightModel = _transform.FindChild("RightHand/right").transform;
_leftTrackedObj = _leftHand.GetComponent<SteamVR_TrackedObject>();//获取手柄
_rightTrackedObj = _rightHand.GetComponent<SteamVR_TrackedObject>();
_lineRendererLeft = _leftModel.GetComponent<LineRenderer>();
_lineRendererRight = _rightModel.GetComponent<LineRenderer>();
InitLeft();
InitRight();
}
public void InPut()
{
try
{
leftDevice = SteamVR_Controller.Input((int)_leftTrackedObj.index);
rightDevice = SteamVR_Controller.Input((int)_rightTrackedObj.index);
if (leftDevice.GetPress(SteamVR_Controller.ButtonMask.Trigger))
{
if (Physics.Raycast(rayLeft, out _leftHit, 20))
{
//linerender
_lineRendererLeft.SetPosition(0, _leftModel.transform.position);
_lineRendererLeft.SetPosition(1, _leftHit.point);
}
if (Physics.Raycast(rayLeft, out _leftHit, 20, 1 << 8))
{
//脚印位置
_foot.position = _leftHit.point + new Vector3(0, 0.002f, 0);
FootRoate();
}
else
{
_foot.position = new Vector3(1000, 1000, 1000);
}
}
if (leftDevice.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))
{
if (Physics.Raycast(rayLeft, out _leftHit, 20, 1 << 8))
{
//瞬移的关键
_transform.position = _foot.position;
}
_foot.position = new Vector3(1000, 1000, 1000);
//归位
InitLeft();
}
if (rightDevice.GetPress(SteamVR_Controller.ButtonMask.Trigger))
{
if (Physics.Raycast(rayRight, out _rightHit, 20))
{
_lineRendererRight.SetPosition(0, _rightModel.transform.position);
_lineRendererRight.SetPosition(1, _rightHit.point);
if (_rightHit.transform.gameObject.layer == 8 || _rightHit.transform.gameObject.layer == 9 || _rightHit.transform.gameObject.layer == 10)
{
Interactable inter = _rightHit.transform.GetComponent<Interactable>();
if (inter != null)
{
inter.HighLighting();
}
}
}
}
if (rightDevice.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))
{
if (Physics.Raycast(rayRight, out _rightHit, 20, 1 << 10))
{
SkyBoxSwrich.Instance.isChance = true;
}
if (Physics.Raycast(rayRight, out _rightHit, 20, 1 << 9))
{
Interactable actable = _rightHit.transform.GetComponent<Interactable>();
actable.Open();
actable.Interactive();
InitRight();
}
else
{
InitRight();
}
}
if (rightDevice.GetPress(SteamVR_Controller.ButtonMask.Touchpad))
{
Debug.Log(11111);
}
}
catch (System.IndexOutOfRangeException e)
{
System.Console.WriteLine(e.Message);
}
}
private void InitLeft()
{
_lineRendererLeft.SetPosition(0, _leftModel.transform.position);
_lineRendererLeft.SetPosition(1, _leftModel.transform.position);
}
private void InitRight()
{
_lineRendererRight.SetPosition(0, _rightModel.transform.position);
_lineRendererRight.SetPosition(1, _rightModel.transform.position);
}
//-*-*-------------脚印
private void FootRoate()
{
//[CameraRig]正方向向量
Vector3 playerForward = transform.forward;
//手柄射线的向量
Vector3 rayVector3 = _leftHit.point - new Vector3(_leftModel.position.x, playerForward.y, _leftModel.position.z);
//求出 俯视角(CameraRig的自身forward正方向也就是z轴方向***与手柄射线)所形成的角度
currentAngle = Vector3.Angle(playerForward, rayVector3);
if (lastAngle != currentAngle)
{
//两向量的叉乘 【unity中 叉乘满足左手定则 大拇指a食指b中指result方向值】
Vector3 result = Vector3.Cross(playerForward, rayVector3);
if (result.y < 0)
{
Quaternion q = Quaternion.identity;
q.eulerAngles = new Vector3(0, -currentAngle, 0);
_foot.rotation = q * initQ;
}
else
{
Quaternion q = Quaternion.identity;
q.eulerAngles = new Vector3(0, currentAngle, 0);
_foot.rotation = q * initQ;
}
lastAngle = currentAngle;
}
}
public void Update()
{
InPut();
}
}
叉乘的用途(脚印)
猜你喜欢
转载自blog.csdn.net/fanfan_hongyun/article/details/81013826
今日推荐
周排行