using System.Collections; using System.Collections.Generic; using UnityEngine; using VRTK; using DG.Tweening; //自带固定螺丝可以移动和固定的物体 如座椅 盖板等 public class ScrewFixationGO : FixedAbs { Transform parentTrans; bool checkPos; Vector3 rightPos; float allowPosError;//位置检测允许误差 单位m bool checkAngle; Vector3 rightAngle; //手柄放下时检测是否符合安装位置需要 public override void UnGrabbed() { bool onAllowableFixed = false;//判断是否满足安装位置需要 this.transform.SetParent(parentTrans); if (checkPos ) { onAllowableFixed = CheckPos(); } if(checkAngle ) { onAllowableFixed = CheckAngle(); } if (onAllowableFixed)//满足安装条件 { StartHoming();//播放归位动画 Locking(); } else//未处于安装位置 暂时不做处理 { UnLocking(); } } //抓起时固定器无法启用 public override void Grabbed() { ChangeSelfFixatorsInter(false); } //改变子物体的可交互状态 private void ChangeSelfFixatorsInter(bool value) { for (int i = 0; i < fixators.Length; i++) { //fixators[i].SetInteractable(value); } } //开始动画复位到准确的安装位置 private void StartHoming() { interactableObject.gameObject.GetComponent().isKinematic = true;//避免重力或其他物体影响其归位 this.transform.DOMove(rightPos, 1f).OnComplete(HomgingOver); this.transform.DORotate(rightAngle, 1f); } //复位完成 启用螺丝交互逻辑 void HomgingOver() { onFixedPos = true; for (int i = 0; i < fixators.Length; i++) { //fixators[i].SetInteractable(true); } } //设置当前物体 安装完成后的父物体 public void SetFixedTrans(Transform parentTrans) { this.parentTrans = parentTrans; } /// /// 设置与父物体的相对正确位置 不设置不检查 /// /// 目标位置 /// 误差距离 public void SetRightPos(Vector3 targetPos,float allowError) { checkPos = true; rightPos = targetPos; allowPosError = allowError; } /// /// 设置与父物体的相对正确角度不设置不检查 /// /// 目标角度 /// 允许误差角度 public void SetRightAngle(Vector3 targetAngle, float allowError) { checkAngle = true; rightAngle = targetAngle; } /// /// /// /// true 符合要求 bool CheckPos() { return Vector3.Magnitude(this.transform.position - rightPos) < allowPosError; } /// /// /// /// true 符合要求 bool CheckAngle() { Vector3 currentAngle = this.transform.localEulerAngles; if (currentAngle.x - rightAngle.x > 5 || currentAngle.y - rightAngle.y > 5 || currentAngle.z - rightAngle.z > 5) return false; else return true; } }