using System.Collections; using System.Collections.Generic; using UnityEngine; using HTC.UnityPlugin.Vive; //定义一个滑槽,可以让配件在碰到滑槽后吸附到滑槽上面 public class GunSlider : MonoBehaviour { private Vector3 startPoint; private Vector3 endPoint; public Vector3 sliderOffSet; [Range(0.0f, 1.0f)] public float offsetPercentage = 0f; public bool haveItem; private GameObject item; private GunItem itemScript_; private GameObject leftHand; private GameObject gun; public Transform startTransForm; public Transform endTransForm; // Use this for initialization void Start () { haveItem = false; leftHand = GameObject.FindGameObjectWithTag("leftHand"); gun = GameObject.FindGameObjectWithTag("gun"); startPoint = startTransForm.localPosition; endPoint = endTransForm.localPosition; } // Update is called once per frame void Update () { if (haveItem) { item.transform.localPosition = startPoint + offsetPercentage * (endPoint - startPoint); //当物品被拖动时,物品会在滑槽之间移动 if (itemScript_.isSlide) { //float distanceStart = (leftHand.transform.position - (startPoint + sliderOffSet + gun.transform.position)).sqrMagnitude; //float distanceEnd = (leftHand.transform.position - (endPoint + sliderOffSet + gun.transform.position)).sqrMagnitude; float distanceStart = (leftHand.transform.position - startTransForm.position).sqrMagnitude; float distanceEnd = (leftHand.transform.position - endTransForm.position).sqrMagnitude; float distanceSE = (endPoint - startPoint).sqrMagnitude; if (distanceStart + distanceSE <= distanceEnd) { offsetPercentage = 0f; } else if (distanceEnd + distanceSE <= distanceStart) { offsetPercentage = 1f; } else { //可以保证x大于0,且随着distance增大而增大 float x = distanceStart + distanceSE - distanceEnd; //比例系数,使得当distanceStart == distanceEnd+distanceSE时,x*y==1 float y = 0.5f / distanceSE; offsetPercentage = x * y; } } if (ViveInput.GetPressUp(HandRole.LeftHand,ControllerButton.Trigger)) { itemScript_.isSlide = false; } } } //检测到配件进入时,调用安装算法 private void OnTriggerEnter(Collider other) { if (other.gameObject.tag == "gunItem") { //该滑槽没有配件的情况下,可以直接安装配件 if (!haveItem) { InstallParts(other); } //该滑槽有配件的情况下,会把滑槽的配件与手上所持的配件进行更换 else { itemScript_.itemBtn.GetComponent().ReturnItem(); Destroy(item); // InstallParts(other); // } } } //安装&替换配件使用的方法 private void InstallParts(Collider other_) { item = other_.gameObject; item.tag = "Untagged"; itemScript_ = item.GetComponent(); itemScript_.itemBtn.GetComponent().InstallItem(startPoint); //重置装配位置(如果不重置可能会导致配件偏移) startPoint = startTransForm.localPosition; endPoint = endTransForm.localPosition; //装配的配件放置在固定位置上面 startPoint += itemScript_.itemBtn.GetComponent().self_.transform.position; endPoint += itemScript_.itemBtn.GetComponent().self_.transform.position; haveItem = true; } }