コード例 #1
0
ファイル: Longbow.cs プロジェクト: Smoothstep/VRChat
 // Token: 0x06005DD7 RID: 24023 RVA: 0x0020D7A3 File Offset: 0x0020BBA3
 public void StartRotationLerp()
 {
     this.lerpStartTime          = Time.time;
     this.lerpBackToZeroRotation = true;
     this.lerpStartRotation      = this.pivotTransform.localRotation;
     Util.ResetTransform(this.nockTransform, true);
 }
コード例 #2
0
        //-------------------------------------------------
        public void StartRotationLerp()
        {
            lerpStartTime          = Time.time;
            lerpBackToZeroRotation = true;
            lerpStartRotation      = pivotTransform.localRotation;

            Util.ResetTransform(nockTransform);
        }
コード例 #3
0
        //-------------------------------------------------
        private GameObject InstantiateArrow()
        {
            GameObject arrow = Instantiate(ArrowPrefab, ArrowNockTransform.position, ArrowNockTransform.rotation);

            arrow.name             = "Bow " + ArrowPrefab.name;
            arrow.transform.parent = ArrowNockTransform;
            Util.ResetTransform(arrow.transform);
            return(arrow);
        }
コード例 #4
0
        // Token: 0x060021FE RID: 8702 RVA: 0x000A8578 File Offset: 0x000A6778
        private void OnChaperoneInfoInitialized()
        {
            ChaperoneInfo instance = ChaperoneInfo.instance;

            if (instance.initialized && instance.roomscale)
            {
                if (this.playAreaPreviewTransform == null)
                {
                    this.playAreaPreviewTransform        = new GameObject("PlayAreaPreviewTransform").transform;
                    this.playAreaPreviewTransform.parent = base.transform;
                    Util.ResetTransform(this.playAreaPreviewTransform, true);
                    this.playAreaPreviewCorner.SetActive(true);
                    this.playAreaPreviewCorners    = new Transform[4];
                    this.playAreaPreviewCorners[0] = this.playAreaPreviewCorner.transform;
                    this.playAreaPreviewCorners[1] = Object.Instantiate <Transform>(this.playAreaPreviewCorners[0]);
                    this.playAreaPreviewCorners[2] = Object.Instantiate <Transform>(this.playAreaPreviewCorners[0]);
                    this.playAreaPreviewCorners[3] = Object.Instantiate <Transform>(this.playAreaPreviewCorners[0]);
                    this.playAreaPreviewCorners[0].transform.parent = this.playAreaPreviewTransform;
                    this.playAreaPreviewCorners[1].transform.parent = this.playAreaPreviewTransform;
                    this.playAreaPreviewCorners[2].transform.parent = this.playAreaPreviewTransform;
                    this.playAreaPreviewCorners[3].transform.parent = this.playAreaPreviewTransform;
                    this.playAreaPreviewSide.SetActive(true);
                    this.playAreaPreviewSides    = new Transform[4];
                    this.playAreaPreviewSides[0] = this.playAreaPreviewSide.transform;
                    this.playAreaPreviewSides[1] = Object.Instantiate <Transform>(this.playAreaPreviewSides[0]);
                    this.playAreaPreviewSides[2] = Object.Instantiate <Transform>(this.playAreaPreviewSides[0]);
                    this.playAreaPreviewSides[3] = Object.Instantiate <Transform>(this.playAreaPreviewSides[0]);
                    this.playAreaPreviewSides[0].transform.parent = this.playAreaPreviewTransform;
                    this.playAreaPreviewSides[1].transform.parent = this.playAreaPreviewTransform;
                    this.playAreaPreviewSides[2].transform.parent = this.playAreaPreviewTransform;
                    this.playAreaPreviewSides[3].transform.parent = this.playAreaPreviewTransform;
                }
                float playAreaSizeX = instance.playAreaSizeX;
                float playAreaSizeZ = instance.playAreaSizeZ;
                this.playAreaPreviewSides[0].localPosition   = new Vector3(0f, 0f, 0.5f * playAreaSizeZ - 0.25f);
                this.playAreaPreviewSides[1].localPosition   = new Vector3(0f, 0f, -0.5f * playAreaSizeZ + 0.25f);
                this.playAreaPreviewSides[2].localPosition   = new Vector3(0.5f * playAreaSizeX - 0.25f, 0f, 0f);
                this.playAreaPreviewSides[3].localPosition   = new Vector3(-0.5f * playAreaSizeX + 0.25f, 0f, 0f);
                this.playAreaPreviewSides[0].localScale      = new Vector3(playAreaSizeX - 0.5f, 1f, 1f);
                this.playAreaPreviewSides[1].localScale      = new Vector3(playAreaSizeX - 0.5f, 1f, 1f);
                this.playAreaPreviewSides[2].localScale      = new Vector3(playAreaSizeZ - 0.5f, 1f, 1f);
                this.playAreaPreviewSides[3].localScale      = new Vector3(playAreaSizeZ - 0.5f, 1f, 1f);
                this.playAreaPreviewSides[0].localRotation   = Quaternion.Euler(0f, 0f, 0f);
                this.playAreaPreviewSides[1].localRotation   = Quaternion.Euler(0f, 180f, 0f);
                this.playAreaPreviewSides[2].localRotation   = Quaternion.Euler(0f, 90f, 0f);
                this.playAreaPreviewSides[3].localRotation   = Quaternion.Euler(0f, 270f, 0f);
                this.playAreaPreviewCorners[0].localPosition = new Vector3(0.5f * playAreaSizeX - 0.25f, 0f, 0.5f * playAreaSizeZ - 0.25f);
                this.playAreaPreviewCorners[1].localPosition = new Vector3(0.5f * playAreaSizeX - 0.25f, 0f, -0.5f * playAreaSizeZ + 0.25f);
                this.playAreaPreviewCorners[2].localPosition = new Vector3(-0.5f * playAreaSizeX + 0.25f, 0f, -0.5f * playAreaSizeZ + 0.25f);
                this.playAreaPreviewCorners[3].localPosition = new Vector3(-0.5f * playAreaSizeX + 0.25f, 0f, 0.5f * playAreaSizeZ - 0.25f);
                this.playAreaPreviewCorners[0].localRotation = Quaternion.Euler(0f, 0f, 0f);
                this.playAreaPreviewCorners[1].localRotation = Quaternion.Euler(0f, 90f, 0f);
                this.playAreaPreviewCorners[2].localRotation = Quaternion.Euler(0f, 180f, 0f);
                this.playAreaPreviewCorners[3].localRotation = Quaternion.Euler(0f, 270f, 0f);
                this.playAreaPreviewTransform.gameObject.SetActive(false);
            }
        }
コード例 #5
0
ファイル: SpawnRenderModel.cs プロジェクト: K07H/The-Forest
 private void ShowController()
 {
     if (this.hand == null || this.hand.controller == null)
     {
         return;
     }
     for (int i = 0; i < this.renderModels.Length; i++)
     {
         if (this.renderModels[i] == null)
         {
             this.renderModels[i] = new GameObject("SteamVR_RenderModel").AddComponent <SteamVR_RenderModel>();
             this.renderModels[i].updateDynamically = false;
             this.renderModels[i].transform.parent  = base.transform;
             Util.ResetTransform(this.renderModels[i].transform, true);
         }
         this.renderModels[i].gameObject.SetActive(true);
         this.renderModels[i].SetDeviceIndex((int)this.hand.controller.index);
     }
 }
コード例 #6
0
ファイル: ArrowHand.cs プロジェクト: DevZhav/The-Forest
        private GameObject InstantiateArrow()
        {
            GameObject gameObject = UnityEngine.Object.Instantiate <GameObject>(this.arrowPrefab, this.arrowNockTransform.position, this.arrowNockTransform.rotation);

            gameObject.name             = "Bow Arrow";
            gameObject.transform.parent = this.arrowNockTransform;
            Util.ResetTransform(gameObject.transform, true);
            this.arrowList.Add(gameObject);
            while (this.arrowList.Count > this.maxArrowCount)
            {
                GameObject gameObject2 = this.arrowList[0];
                this.arrowList.RemoveAt(0);
                if (gameObject2)
                {
                    UnityEngine.Object.Destroy(gameObject2);
                }
            }
            return(gameObject);
        }
コード例 #7
0
        //-------------------------------------------------
        private void ShowController()
        {
            if (hand == null || hand.controller == null)
            {
                return;
            }

            for (int i = 0; i < renderModels.Length; i++)
            {
                if (renderModels[i] == null)
                {
                    renderModels[i] = new GameObject("SteamVR_RenderModel").AddComponent <SteamVR_RenderModel>();
                    renderModels[i].updateDynamically = false;                     // Update one per frame (see Update() method)
                    renderModels[i].transform.parent  = transform;
                    Util.ResetTransform(renderModels[i].transform);
                }

                renderModels[i].gameObject.SetActive(true);
                renderModels[i].SetDeviceIndex((int)hand.controller.index);
            }
        }
コード例 #8
0
ファイル: ArrowHand.cs プロジェクト: tiare/UnityViveSetup
        //-------------------------------------------------
        private GameObject InstantiateArrow()
        {
            UnityEngine.GameObject arrow = Instantiate(arrowPrefab, arrowNockTransform.position, arrowNockTransform.rotation) as UnityEngine.GameObject;
            arrow.name             = "Bow Arrow";
            arrow.transform.parent = arrowNockTransform;
            Util.ResetTransform(arrow.transform);

            arrowList.Add(arrow);

            while (arrowList.Count > maxArrowCount)
            {
                UnityEngine.GameObject oldArrow = arrowList[0];
                arrowList.RemoveAt(0);
                if (oldArrow)
                {
                    Destroy(oldArrow);
                }
            }

            return(arrow);
        }
コード例 #9
0
        private GameObject InstantiateArrow()
        {
            GameObject arrow = Instantiate(arrowHand.arrowPrefab, arrowHand.arrowNockTransform.position, arrowHand.arrowNockTransform.rotation) as GameObject;

            arrow.name             = "Bow Arrow";
            arrow.transform.parent = arrowHand.arrowNockTransform;
            Util.ResetTransform(arrow.transform);

            // arrowList.Add( arrow );

            // while ( arrowList.Count > maxArrowCount )
            // {
            //  GameObject oldArrow = arrowList[0];
            //  arrowList.RemoveAt( 0 );
            //  if ( oldArrow )
            //  {
            //      Destroy( oldArrow );
            //  }
            // }

            return(arrow);
        }
コード例 #10
0
        public void NockArrow(Inventory linkedInventory)          //, ArrowHand arrowHand) {
        {
            Debug.LogError("nocked");
            // If arrow is close enough to the nock position and we're pressing the trigger, and we're not nocked yet, Nock

            if (inNockRange && !nocked)

            {
                if (arrowHand.currentArrow == null)
                {
                    arrowHand.currentArrow = InstantiateArrow();
                }

                // nocked = true;
                StartNock( );                                                //arrowHand );

                linkedInventory.GetComponent <Interactor>().HoverLock(null); // arrowhand.GetComponent<Interactable>() );

                arrowHand.currentArrow.transform.parent = nockTransform;
                Util.ResetTransform(arrowHand.currentArrow.transform);
                Util.ResetTransform(arrowHand.arrowNockTransform);
            }
        }
コード例 #11
0
        public void AttemptArrowFire(Inventory linkedInventory)
        {
            if (nocked)

            {
                if (pulled)                   // If bow is pulled back far enough, fire arrow, otherwise reset arrow in arrowhand
                {
                    FireArrow();
                }
                else
                {
                    arrowHand.arrowNockTransform.rotation   = arrowHand.currentArrow.transform.rotation;
                    arrowHand.currentArrow.transform.parent = arrowHand.arrowNockTransform;
                    Util.ResetTransform(arrowHand.currentArrow.transform);
                    nocked = false;
                    ReleaseNock();

                    linkedInventory.GetComponent <Interactor>().HoverUnlock(null);                     //arrowhand.GetComponent<Interactable>() );
                }

                // Arrow is releasing from the bow, tell the bow to lerp back to controller rotation
                StartRotationLerp();
            }
        }
コード例 #12
0
        //-------------------------------------------------
        private void OnChaperoneInfoInitialized()
        {
            ChaperoneInfo chaperone = ChaperoneInfo.instance;

            if (chaperone.initialized && chaperone.roomscale)
            {
                //Set up the render model for the play area bounds

                if (playAreaPreviewTransform == null)
                {
                    playAreaPreviewTransform        = new GameObject("PlayAreaPreviewTransform").transform;
                    playAreaPreviewTransform.parent = transform;
                    Util.ResetTransform(playAreaPreviewTransform);

                    playAreaPreviewCorner.SetActive(true);
                    playAreaPreviewCorners    = new Transform[4];
                    playAreaPreviewCorners[0] = playAreaPreviewCorner.transform;
                    playAreaPreviewCorners[1] = Instantiate(playAreaPreviewCorners[0]);
                    playAreaPreviewCorners[2] = Instantiate(playAreaPreviewCorners[0]);
                    playAreaPreviewCorners[3] = Instantiate(playAreaPreviewCorners[0]);

                    playAreaPreviewCorners[0].transform.parent = playAreaPreviewTransform;
                    playAreaPreviewCorners[1].transform.parent = playAreaPreviewTransform;
                    playAreaPreviewCorners[2].transform.parent = playAreaPreviewTransform;
                    playAreaPreviewCorners[3].transform.parent = playAreaPreviewTransform;

                    playAreaPreviewSide.SetActive(true);
                    playAreaPreviewSides    = new Transform[4];
                    playAreaPreviewSides[0] = playAreaPreviewSide.transform;
                    playAreaPreviewSides[1] = Instantiate(playAreaPreviewSides[0]);
                    playAreaPreviewSides[2] = Instantiate(playAreaPreviewSides[0]);
                    playAreaPreviewSides[3] = Instantiate(playAreaPreviewSides[0]);

                    playAreaPreviewSides[0].transform.parent = playAreaPreviewTransform;
                    playAreaPreviewSides[1].transform.parent = playAreaPreviewTransform;
                    playAreaPreviewSides[2].transform.parent = playAreaPreviewTransform;
                    playAreaPreviewSides[3].transform.parent = playAreaPreviewTransform;
                }

                float x = chaperone.playAreaSizeX;
                float z = chaperone.playAreaSizeZ;

                playAreaPreviewSides[0].localPosition = new Vector3(0.0f, 0.0f, 0.5f * z - 0.25f);
                playAreaPreviewSides[1].localPosition = new Vector3(0.0f, 0.0f, -0.5f * z + 0.25f);
                playAreaPreviewSides[2].localPosition = new Vector3(0.5f * x - 0.25f, 0.0f, 0.0f);
                playAreaPreviewSides[3].localPosition = new Vector3(-0.5f * x + 0.25f, 0.0f, 0.0f);

                playAreaPreviewSides[0].localScale = new Vector3(x - 0.5f, 1.0f, 1.0f);
                playAreaPreviewSides[1].localScale = new Vector3(x - 0.5f, 1.0f, 1.0f);
                playAreaPreviewSides[2].localScale = new Vector3(z - 0.5f, 1.0f, 1.0f);
                playAreaPreviewSides[3].localScale = new Vector3(z - 0.5f, 1.0f, 1.0f);

                playAreaPreviewSides[0].localRotation = Quaternion.Euler(0.0f, 0.0f, 0.0f);
                playAreaPreviewSides[1].localRotation = Quaternion.Euler(0.0f, 180.0f, 0.0f);
                playAreaPreviewSides[2].localRotation = Quaternion.Euler(0.0f, 90.0f, 0.0f);
                playAreaPreviewSides[3].localRotation = Quaternion.Euler(0.0f, 270.0f, 0.0f);

                playAreaPreviewCorners[0].localPosition = new Vector3(0.5f * x - 0.25f, 0.0f, 0.5f * z - 0.25f);
                playAreaPreviewCorners[1].localPosition = new Vector3(0.5f * x - 0.25f, 0.0f, -0.5f * z + 0.25f);
                playAreaPreviewCorners[2].localPosition = new Vector3(-0.5f * x + 0.25f, 0.0f, -0.5f * z + 0.25f);
                playAreaPreviewCorners[3].localPosition = new Vector3(-0.5f * x + 0.25f, 0.0f, 0.5f * z - 0.25f);

                playAreaPreviewCorners[0].localRotation = Quaternion.Euler(0.0f, 0.0f, 0.0f);
                playAreaPreviewCorners[1].localRotation = Quaternion.Euler(0.0f, 90.0f, 0.0f);
                playAreaPreviewCorners[2].localRotation = Quaternion.Euler(0.0f, 180.0f, 0.0f);
                playAreaPreviewCorners[3].localRotation = Quaternion.Euler(0.0f, 270.0f, 0.0f);

                playAreaPreviewTransform.gameObject.SetActive(false);
            }
        }
コード例 #13
0
ファイル: ArrowHand.cs プロジェクト: kliments/Master-s-thesis
        //-------------------------------------------------
        private void HandAttachedUpdate(Hand hand)
        {
            if (bow == null)
            {
                FindBow();
            }

            if (bow == null)
            {
                return;
            }

            if (allowArrowSpawn && (currentArrow == null))                 // If we're allowed to have an active arrow in hand but don't yet, spawn one
            {
                currentArrow = InstantiateArrow();
                arrowSpawnSound.Play();
            }

            var distanceToNockPosition = Vector3.Distance(transform.parent.position, bow.nockTransform.position);

            // If there's an arrow spawned in the hand and it's not nocked yet
            if (!nocked)
            {
                // If we're close enough to nock position that we want to start arrow rotation lerp, do so
                if (distanceToNockPosition < rotationLerpThreshold)
                {
                    var lerp = Util.RemapNumber(distanceToNockPosition, rotationLerpThreshold, lerpCompleteDistance, 0, 1);

                    arrowNockTransform.rotation = Quaternion.Lerp(arrowNockTransform.parent.rotation, bow.nockRestTransform.rotation, lerp);
                }
                else                 // Not close enough for rotation lerp, reset rotation
                {
                    arrowNockTransform.localRotation = Quaternion.identity;
                }

                // If we're close enough to the nock position that we want to start arrow position lerp, do so
                if (distanceToNockPosition < positionLerpThreshold)
                {
                    var posLerp = Util.RemapNumber(distanceToNockPosition, positionLerpThreshold, lerpCompleteDistance, 0, 1);

                    posLerp = Mathf.Clamp(posLerp, 0f, 1f);

                    arrowNockTransform.position = Vector3.Lerp(arrowNockTransform.parent.position, bow.nockRestTransform.position, posLerp);
                }
                else                 // Not close enough for position lerp, reset position
                {
                    arrowNockTransform.position = arrowNockTransform.parent.position;
                }


                // Give a haptic tick when lerp is visually complete
                if (distanceToNockPosition < lerpCompleteDistance)
                {
                    if (!arrowLerpComplete)
                    {
                        arrowLerpComplete = true;
                        hand.controller.TriggerHapticPulse(500);
                    }
                }
                else
                {
                    if (arrowLerpComplete)
                    {
                        arrowLerpComplete = false;
                    }
                }

                // Allow nocking the arrow when controller is close enough
                if (distanceToNockPosition < nockDistance)
                {
                    if (!inNockRange)
                    {
                        inNockRange = true;
                        bow.ArrowInPosition();
                    }
                }
                else
                {
                    if (inNockRange)
                    {
                        inNockRange = false;
                    }
                }

                // If arrow is close enough to the nock position and we're pressing the trigger, and we're not nocked yet, Nock
                if ((distanceToNockPosition < nockDistance) && hand.controller.GetPress(SteamVR_Controller.ButtonMask.Trigger) && !nocked)
                {
                    if (currentArrow == null)
                    {
                        currentArrow = InstantiateArrow();
                    }

                    nocked = true;
                    bow.StartNock(this);
                    hand.HoverLock(GetComponent <Interactable>());
                    allowTeleport.teleportAllowed = false;
                    currentArrow.transform.parent = bow.nockTransform;
                    Util.ResetTransform(currentArrow.transform);
                    Util.ResetTransform(arrowNockTransform);
                }
            }


            // If arrow is nocked, and we release the trigger
            if (nocked && (!hand.controller.GetPress(SteamVR_Controller.ButtonMask.Trigger) || hand.controller.GetPressUp(SteamVR_Controller.ButtonMask.Trigger)))
            {
                if (bow.pulled)                   // If bow is pulled back far enough, fire arrow, otherwise reset arrow in arrowhand
                {
                    FireArrow();
                }
                else
                {
                    arrowNockTransform.rotation   = currentArrow.transform.rotation;
                    currentArrow.transform.parent = arrowNockTransform;
                    Util.ResetTransform(currentArrow.transform);
                    nocked = false;
                    bow.ReleaseNock();
                    hand.HoverUnlock(GetComponent <Interactable>());
                    allowTeleport.teleportAllowed = true;
                }

                bow.StartRotationLerp();                 // Arrow is releasing from the bow, tell the bow to lerp back to controller rotation
            }
        }
コード例 #14
0
ファイル: ArrowHand.cs プロジェクト: DevZhav/The-Forest
        private void HandAttachedUpdate(Hand hand)
        {
            if (this.bow == null)
            {
                this.FindBow();
            }
            if (this.bow == null)
            {
                return;
            }
            if (this.allowArrowSpawn && this.currentArrow == null)
            {
                this.currentArrow = this.InstantiateArrow();
                this.arrowSpawnSound.Play();
            }
            float num = Vector3.Distance(base.transform.parent.position, this.bow.nockTransform.position);

            if (!this.nocked)
            {
                if (num < this.rotationLerpThreshold)
                {
                    float t = Util.RemapNumber(num, this.rotationLerpThreshold, this.lerpCompleteDistance, 0f, 1f);
                    this.arrowNockTransform.rotation = Quaternion.Lerp(this.arrowNockTransform.parent.rotation, this.bow.nockRestTransform.rotation, t);
                }
                else
                {
                    this.arrowNockTransform.localRotation = Quaternion.identity;
                }
                if (num < this.positionLerpThreshold)
                {
                    float num2 = Util.RemapNumber(num, this.positionLerpThreshold, this.lerpCompleteDistance, 0f, 1f);
                    num2 = Mathf.Clamp(num2, 0f, 1f);
                    this.arrowNockTransform.position = Vector3.Lerp(this.arrowNockTransform.parent.position, this.bow.nockRestTransform.position, num2);
                }
                else
                {
                    this.arrowNockTransform.position = this.arrowNockTransform.parent.position;
                }
                if (num < this.lerpCompleteDistance)
                {
                    if (!this.arrowLerpComplete)
                    {
                        this.arrowLerpComplete = true;
                        hand.controller.TriggerHapticPulse(500, EVRButtonId.k_EButton_Axis0);
                    }
                }
                else if (this.arrowLerpComplete)
                {
                    this.arrowLerpComplete = false;
                }
                if (num < this.nockDistance)
                {
                    if (!this.inNockRange)
                    {
                        this.inNockRange = true;
                        this.bow.ArrowInPosition();
                    }
                }
                else if (this.inNockRange)
                {
                    this.inNockRange = false;
                }
                if (num < this.nockDistance && hand.controller.GetPress(8589934592UL) && !this.nocked)
                {
                    if (this.currentArrow == null)
                    {
                        this.currentArrow = this.InstantiateArrow();
                    }
                    this.nocked = true;
                    this.bow.StartNock(this);
                    hand.HoverLock(base.GetComponent <Interactable>());
                    this.allowTeleport.teleportAllowed = false;
                    this.currentArrow.transform.parent = this.bow.nockTransform;
                    Util.ResetTransform(this.currentArrow.transform, true);
                    Util.ResetTransform(this.arrowNockTransform, true);
                }
            }
            if (this.nocked && (!hand.controller.GetPress(8589934592UL) || hand.controller.GetPressUp(8589934592UL)))
            {
                if (this.bow.pulled)
                {
                    this.FireArrow();
                }
                else
                {
                    this.arrowNockTransform.rotation   = this.currentArrow.transform.rotation;
                    this.currentArrow.transform.parent = this.arrowNockTransform;
                    Util.ResetTransform(this.currentArrow.transform, true);
                    this.nocked = false;
                    this.bow.ReleaseNock();
                    hand.HoverUnlock(base.GetComponent <Interactable>());
                    this.allowTeleport.teleportAllowed = true;
                }
                this.bow.StartRotationLerp();
            }
        }
コード例 #15
0
        //-------------------------------------------------
        private void HandAttachedUpdate(Hand hand)
        {
            if (_bow == null)
            {
                FindBow();
            }

            if (_bow == null)
            {
                return;
            }

            if (allowArrowSpawn && (_currentArrow == null))                 // If we're allowed to have an active arrow in hand but don't yet, spawn one
            {
                InstantiateAndSetArrow();
                arrowSpawnSound.Play();
            }

            float distanceToNockPosition = Vector3.Distance(transform.parent.position, _bow.nockTransform.position);

            // If there's an arrow spawned in the hand and it's not nocked yet
            if (!nocked)
            {
                // If we're close enough to nock position that we want to start arrow rotation lerp, do so
                if (distanceToNockPosition < rotationLerpThreshold)
                {
                    float lerp = Util.RemapNumber(distanceToNockPosition, rotationLerpThreshold, lerpCompleteDistance, 0, 1);
                    ArrowNockTransform.rotation = Quaternion.Lerp(ArrowNockTransform.parent.rotation, _bow.nockRestTransform.rotation, lerp);
                }
                else                 // Not close enough for rotation lerp, reset rotation
                {
                    ArrowNockTransform.localRotation = Quaternion.identity;
                }
                // If we're close enough to the nock position that we want to start arrow position lerp, do so
                if (distanceToNockPosition < positionLerpThreshold)
                {
                    float posLerp = Util.RemapNumber(distanceToNockPosition, positionLerpThreshold, lerpCompleteDistance, 0, 1);

                    posLerp = Mathf.Clamp(posLerp, 0f, 1f);

                    ArrowNockTransform.position = Vector3.Lerp(ArrowNockTransform.parent.position, _bow.nockRestTransform.position, posLerp);
                }
                else                 // Not close enough for position lerp, reset position
                {
                    ArrowNockTransform.position = ArrowNockTransform.parent.position;
                }


                // Give a haptic tick when lerp is visually complete
                if (distanceToNockPosition < lerpCompleteDistance)
                {
                    if (!arrowLerpComplete)
                    {
                        arrowLerpComplete = true;
                        hand.TriggerHapticPulse(500);
                    }
                }
                else if (arrowLerpComplete)
                {
                    arrowLerpComplete = false;
                }

                // Allow nocking the arrow when controller is close enough
                if (distanceToNockPosition < nockDistance)
                {
                    if (!inNockRange)
                    {
                        inNockRange = true;
                        _bow.ArrowInPosition();
                    }
                }
                else if (inNockRange)
                {
                    inNockRange = false;
                }

                GrabTypes bestGrab = hand.GetBestGrabbingType(GrabTypes.Pinch, true);

                // If arrow is close enough to the nock position and we're pressing the trigger, and we're not nocked yet, Nock
                if ((distanceToNockPosition < nockDistance) && bestGrab != GrabTypes.None && !nocked)
                {
                    if (_currentArrow == null)
                    {
                        InstantiateAndSetArrow();
                    }

                    nocked         = true;
                    nockedWithType = bestGrab;
                    _bow.StartNock(this);
                    hand.HoverLock(GetComponent <Interactable>());
                    _currentArrow.transform.parent = _bow.nockTransform;
                    Util.ResetTransform(_currentArrow.transform);
                    Util.ResetTransform(ArrowNockTransform);
                }
            }
            if (_currentArrowCmpt != null)
            {
                _currentArrowCmpt.Charging = nocked && _bow.pulled;
            }

            // If arrow is nocked, and we release the trigger
            if (nocked)
            {
                if (hand.IsGrabbingWithType(nockedWithType) == false)
                {
                    if (_bow.pulled)                     // If bow is pulled back far enough, fire arrow, otherwise reset arrow in arrowhand
                    {
                        FireArrow();
                    }
                    else
                    {
                        ArrowNockTransform.rotation    = _currentArrow.transform.rotation;
                        _currentArrow.transform.parent = ArrowNockTransform;
                        Util.ResetTransform(_currentArrow.transform);
                        nocked         = false;
                        nockedWithType = GrabTypes.None;
                        _bow.ReleaseNock();
                        hand.HoverUnlock(GetComponent <Interactable>());
                    }
                    _bow.StartRotationLerp();                     // Arrow is releasing from the bow, tell the bow to lerp back to controller rotation
                }
            }
        }
コード例 #16
0
        //-------------------------------------------------
        private void HandAttachedUpdate(Hand hand)
        {
            //quiver.GetComponent<Quiver>().
            //Debug.Log("update");
            if (bow == null)
            {
                FindBow();
            }

            if (bow == null)
            {
                return;
            }

            float distanceToNockPosition = Vector3.Distance(transform.parent.position, bow.nockTransform.position);

            int quiverType = quiverSelection.GetComponent <Dropdown>().value + 1;

            switch (quiverType)
            {
            case 1:
                quiver = GameObject.Find("Quiver (Neck)");
                break;

            case 2:
                quiver = GameObject.Find("Quiver (Shoulder)");
                break;

            case 3:
                quiver = GameObject.Find("Quiver (Chest)");
                break;

            default:
                print("Oops");
                break;
            }

            noQuiver = quiverEnable.GetComponent <Toggle>().isOn;

            if (allowArrowSpawn && (currentArrow == null) && ((noQuiver || quiver.GetComponent <Interactable>().isHovering)))   // If we're allowed to have an active arrow in hand but don't yet, spawn one
            {
                currentArrow = InstantiateArrow();
                arrowSpawnSound.Play();
                hand.TriggerHapticPulse(5000);
            }



            // If there's an arrow spawned in the hand and it's not nocked yet
            else if ((currentArrow != null) && !nocked)
            {
                // If we're close enough to nock position that we want to start arrow rotation lerp, do so
                if (distanceToNockPosition < rotationLerpThreshold)
                {
                    float lerp = Util.RemapNumber(distanceToNockPosition, rotationLerpThreshold, lerpCompleteDistance, 0, 1);

                    arrowNockTransform.rotation = Quaternion.Lerp(arrowNockTransform.parent.rotation, bow.nockRestTransform.rotation, lerp);
                }
                else                 // Not close enough for rotation lerp, reset rotation
                {
                    arrowNockTransform.localRotation = Quaternion.identity;
                }

                // If we're close enough to the nock position that we want to start arrow position lerp, do so
                if (distanceToNockPosition < positionLerpThreshold)
                {
                    float posLerp = Util.RemapNumber(distanceToNockPosition, positionLerpThreshold, lerpCompleteDistance, 0, 1);

                    posLerp = Mathf.Clamp(posLerp, 0f, 1f);

                    arrowNockTransform.position = Vector3.Lerp(arrowNockTransform.parent.position, bow.nockRestTransform.position, posLerp);
                }
                else                 // Not close enough for position lerp, reset position
                {
                    arrowNockTransform.position = arrowNockTransform.parent.position;
                }


                // Give a haptic tick when lerp is visually complete
                if (distanceToNockPosition < lerpCompleteDistance)
                {
                    if (!arrowLerpComplete)
                    {
                        arrowLerpComplete = true;
                        hand.TriggerHapticPulse(500);
                    }
                }
                else
                {
                    if (arrowLerpComplete)
                    {
                        arrowLerpComplete = false;
                    }
                }

                // Allow nocking the arrow when controller is close enough
                if (distanceToNockPosition < nockDistance)
                {
                    if (!inNockRange)
                    {
                        inNockRange = true;
                        bow.ArrowInPosition();
                    }
                }
                else
                {
                    if (inNockRange)
                    {
                        inNockRange = false;
                    }
                }

                GrabTypes bestGrab = hand.GetBestGrabbingType(GrabTypes.Pinch, true);

                // If arrow is close enough to the nock position and we're pressing the trigger, and we're not nocked yet, Nock
                if ((distanceToNockPosition < nockDistance) && bestGrab != GrabTypes.None && !nocked)
                {
                    if (currentArrow == null)
                    {
                        currentArrow = InstantiateArrow();
                    }

                    nocked         = true;
                    nockedWithType = bestGrab;
                    bow.StartNock(this);
                    hand.HoverLock(GetComponent <Interactable>());
                    allowTeleport.teleportAllowed = false;
                    currentArrow.transform.parent = bow.nockTransform;
                    Util.ResetTransform(currentArrow.transform);
                    Util.ResetTransform(arrowNockTransform);
                }
            }


            // If arrow is nocked, and we release the trigger
            if (nocked && hand.IsGrabbingWithType(nockedWithType) == false)
            {
                if (bow.pulled)                   // If bow is pulled back far enough, fire arrow, otherwise reset arrow in arrowhand
                {
                    FireArrow();
                }
                else
                {
                    arrowNockTransform.rotation   = currentArrow.transform.rotation;
                    currentArrow.transform.parent = arrowNockTransform;
                    Util.ResetTransform(currentArrow.transform);
                    nocked         = false;
                    nockedWithType = GrabTypes.None;
                    bow.ReleaseNock();
                    hand.HoverUnlock(GetComponent <Interactable>());
                    allowTeleport.teleportAllowed = true;
                }

                bow.StartRotationLerp();                 // Arrow is releasing from the bow, tell the bow to lerp back to controller rotation
            }
        }