예제 #1
0
    private void InCollision( )
    {
        distToCore = 0.0f;

        // Iterate through the list of hands
        for (int i = 0; i < HandSituations.Count; i++)
        {
            Vector3 handRelative = HandSituations[i].hand.transform.InverseTransformPoint(transform.position);

            // In future, omit Sqrt to optimize.
            HandSituations[i].myDistToCore = Mathf.Sqrt(Mathf.Pow(handRelative.x, 2) + Mathf.Pow(handRelative.y, 2));

            // Make distToCore be from 0 to 1
            HandSituations[i].myDistToCore /= radius;
            if (debug)
            {
                Debug.Log(i + " mydistToCore " + HandSituations[i].myDistToCore);
            }

            // Pulse intentity increases with proximity
            int pulseIntensity = Mathf.RoundToInt(999.0f / HandSituations[i].myDistToCore); // High is 3999
            HandSituations[i].hand.HapticPulse(pulseIntensity);
            // if (debug) Debug.Log(i + " pulseIntensity " + pulseIntensity);

            // Register a point for every x seconds in collision
            scoreTimer += Time.deltaTime;
            if (scoreTimer > 2.0f)
            {
                OpponentLord.RegisterHit(this);
                scoreTimer = 0.0f;
            }

            // Place the hand fx on the fingertips.
            HandSituations[i].fx_hitHand.transform.position = HandSituations[i].hand.transform.position + 0.15f * HandSituations[i].hand.transform.forward;

            // Set the total distToCore based on how many hands there are.
            distToCore += HandSituations[i].myDistToCore / HandSituations.Count;
        }
    }
예제 #2
0
    private void OnCollisionEnter(Collision collision)
    {
        if (state == OpponentState.Untouched)
        {
            VRNodeMinion vrNodeMinion = collision.gameObject.GetComponent <VRNodeMinion>();
            if (vrNodeMinion != null)
            {
                var sit = new HandSituation();
                HandSituations.Add(sit);
                sit.hand = vrNodeMinion;

                reboundDir = sit.hand.GetForce( ).normalized;
                reboundMod = sit.hand.GetForce( ).magnitude / Time.deltaTime * 2.0f;  // This range is about 0.0f to 4.0f.

                if (debug)
                {
                    Debug.Log("Hit by hand reboundMod: " + reboundMod);
                }

                // Can only collide with "gloves on"
                if (sit.hand.glove != null && sit.hand.glove.gameObject.activeInHierarchy)
                {
                    state = OpponentState.Hit;
                    GameLord.instance.MusicLord.PlayResponseClip(transform.localPosition);
                    SetRends(rewardMat);
                    fx_hitHand_one.SetActive(true);
                    OpponentLord.RegisterHit(this);

                    // Flatten
                    transform.localScale = new Vector3(transform.localScale.x, transform.localScale.y, 0.1f * transform.localScale.z);

                    // Turn light
                    rewardMat.SetColor("_EmissionColor", rewardMat.color * 0.25f * reboundMod);
                }
                else
                {
                    state = OpponentState.Missed;
                    SetRends(punishMat);
                    timer = 0.5f;
                }
            }
        }
        else if (state == OpponentState.Passed)
        {
            // Can only damage the player once
            if (!damage && collision.gameObject == GameLord.instance.Player.head)
            {
                damage = true;
                timer  = 0.5f; // Give the fx time
                GameLord.instance.Player.OnDamage(transform.position);
            }
        }
        else if (state == OpponentState.Hit)
        {
            if (debug)
            {
                Debug.Log("OnCollisionEnter: Hit by other: " + collision.gameObject.name);
            }
            if (!finished)
            {
                Shrink shrink = collision.gameObject.GetComponent <Shrink>();
                if (shrink != null)
                {
                    if (debug)
                    {
                        Debug.Log("OnCollisionEnter: Hit by Shrink");
                    }
                    shrink.OnHit( );
                    fx_hitTrigger.SetActive(true);
                    timer    = 1.0f; // Give the fx time
                    finished = true;
                }
            }
        }
    }