コード例 #1
0
        private void Update()
        {
            if (!Initialized)
            {
                return;
            }

            bubbleTransform.position = Vector3.Lerp(bubbleTransform.position, initialPosition, bubbleReturnSpeed * Time.deltaTime);

            bubbleVelocity = Vector3.Lerp(bubbleVelocity, Vector3.zero, Time.deltaTime);
            for (int i = 0; i < fingertips.Length; i++)
            {
                Fingertip fingertip = fingertips[i];
                fingertip.Block.SetColor("_Color", fingertip.Color);
                fingertip.Renderer.SetPropertyBlock(fingertip.Block);

                fingertip.PrevPoint = fingertip.Point;
                fingertip.Point     = fingers[i].position;
                fingertip.Velocity  = (fingertip.Point - fingertip.PrevPoint);

                fingertip.Renderer.transform.localScale = Vector3.one * touchBubbleCurve.Evaluate(Time.time - fingertip.TimeIntersectedBubble);

                if (Vector3.Distance(fingertip.Point, bubbleTransform.position) < bubble.Radius)
                {
                    bubbleVelocity += fingertip.Velocity;
                }
                fingertips[i] = fingertip;
            }

            bubbleTransform.position   += (bubbleVelocity * fingerForce);
            controller.RadiusMultiplier = bubbleVelocity.magnitude * fingerForce;
        }
コード例 #2
0
    private void Update()
    {
        if (!Initialized)
        {
            return;
        }

        for (int i = 0; i < chunks.Length; i++)
        {
            chunkHeat[i] = Mathf.Lerp(chunkHeat[i], 0f, Time.deltaTime * heatDecreaseSpeed);

            LavaChunk chunk = chunks[i];
            chunk.Heat = chunkHeat[i];
            Vector4 hdrColor = Vector4.zero;
            hdrColor.x = baseColor.r;
            hdrColor.y = baseColor.g;
            hdrColor.z = baseColor.b;

            Color color = heatColor.Evaluate(chunkHeat[i]);
            hdrColor.x += color.r * 6;
            hdrColor.y += color.g * 6;
            hdrColor.z += color.b * 6;

            chunkPropertyBocks[i].SetColor("_EmissiveColor", hdrColor);
            chunk.Renderer.SetPropertyBlock(chunkPropertyBocks[i]);
        }

        for (int i = 0; i < fingertips.Length; i++)
        {
            Fingertip fingertip = fingertips[i];
            fingertip.Emission.enabled = (fingertip.Heat > 0.25f);
            fingertip.Heat             = Mathf.Lerp(fingertip.Heat, 0f, Time.deltaTime * heatDecreaseSpeed);
            fingertips[i] = fingertip;
        }

        for (int i = 0; i < lavaBubbles.Length; i++)
        {
            if (lavaBubbles[i].gameObject.activeSelf)
            {
                if (!lavaBubbles[i].enabled)
                {
                    lavaBubbles[i].gameObject.SetActive(false);
                }
            }
            else
            {
                if (Random.value > spawnOdds)
                {
                    if (!Physics.CheckSphere(lavaBubbles[i].transform.position, bubbleCheckRadius, chunkLayer))
                    {
                        lavaBubbles[i].gameObject.SetActive(true);
                    }
                }
            }
        }

        lavaScrollPos += scrollSpeed * Time.deltaTime;
        lavaMat.SetTextureOffset("_MainTex", lavaScrollPos);
    }
コード例 #3
0
    protected override void FixedUpdate()
    {
        if (!Initialized)
        {
            return;
        }

        base.FixedUpdate();

        for (int i = 0; i < fingers.Length; i++)
        {
            Transform finger    = fingers[i];
            Fingertip fingertip = fingertips[i];

            if (!finger.gameObject.activeSelf)
            {
                continue;
            }

            // If the finger is below the surface, ignore it
            float distToSurface = Vector3.Distance(finger.position, transform.position);
            if (distToSurface < SurfaceRadius)
            {
                continue;
            }

            for (int chunkIndex = 0; chunkIndex < chunks.Length; chunkIndex++)
            {
                LavaChunk chunk      = chunks[chunkIndex];
                Vector3   fingerPos  = finger.position;
                Vector3   closestPos = chunk.Collider.ClosestPoint(fingerPos);
                float     dist       = Vector3.Distance(fingerPos, closestPos);
                if (dist > fingerForceDist)
                {
                    continue;
                }

                // Add heat and force to the chunk
                Vector3 force = (closestPos - fingerPos).normalized * fingerPushForce;
                chunk.RigidBody.AddForceAtPosition(force, fingerPos, ForceMode.Force);
                chunkHeat[chunkIndex] = Mathf.Lerp(chunkHeat[chunkIndex], 1f, Time.fixedDeltaTime * heatIncreaseSpeed);
                chunkHeat[i]          = Mathf.Lerp(chunkHeat[i], 1f, Time.fixedDeltaTime * heatIncreaseSpeed * chunks[i].SubmergedAmount);
                // Add heat to the fingertip
                fingertip.Heat = Mathf.Lerp(fingertip.Heat, 1f, Time.fixedDeltaTime * heatIncreaseSpeed);
            }

            fingertips[i] = fingertip;
        }
    }
コード例 #4
0
        private void OnExitBubble(int innerBubbleIndex)
        {
            Fingertip f = fingertips[innerBubbleIndex];

            f.Audio.pitch = UnityEngine.Random.Range(0.8f, 1.2f);
            f.Audio.clip  = enterBubbleClips[UnityEngine.Random.Range(0, enterBubbleClips.Length)];
            f.Audio.Play();
            f.TimeIntersectedBubble      = Time.time;
            fingertips[innerBubbleIndex] = f;

            for (int i = 0; i < bubbleTouchParticles.Length; i++)
            {
                if (!bubbleTouchParticles[i].gameObject.activeSelf)
                {
                    bubbleTouchParticles[i].transform.position = f.Point;
                    bubbleTouchParticles[i].gameObject.SetActive(true);
                    break;
                }
            }
        }
コード例 #5
0
        public override void Initialize(Vector3 surfacePosition)
        {
            base.Initialize(surfacePosition);

            initialPosition = bubbleTransform.position;

            fingertips = new Fingertip[fingers.Length];
            for (int i = 0; i < fingers.Length; i++)
            {
                Fingertip fingertip = new Fingertip();
                fingertip.Block    = new MaterialPropertyBlock();
                fingertip.Renderer = fingers[i].GetComponentInChildren <MeshRenderer>();
                fingertip.Color    = bubble.InnerBubbles[i].Color;
                fingertip.Audio    = fingers[i].GetComponentInChildren <AudioSource>();
                fingertips[i]      = fingertip;
            }

            bubble.OnEnterBubble += OnEnterBubble;
            bubble.OnExitBubble  += OnExitBubble;
        }
コード例 #6
0
    public override void Initialize(Vector3 surfacePosition)
    {
        base.Initialize(surfacePosition);

        // Set up our bubbles
        for (int i = 0; i < lavaBubbles.Length; i++)
        {
            Vector3 randomPos = Random.onUnitSphere * bubbleDistance;
            lavaBubbles[i].transform.up = randomPos.normalized;
            lavaBubbles[i].transform.Rotate(-90f, 0f, 0f, Space.Self);
            lavaBubbles[i].transform.localPosition = randomPos;
            lavaBubbles[i].gameObject.SetActive(false);
        }

        chunkHeat          = new float[chunks.Length];
        chunkPropertyBocks = new MaterialPropertyBlock[chunks.Length];

        for (int i = 0; i < chunks.Length; i++)
        {
            LavaChunk chunk = chunks[i];
            chunk.RigidBody.AddForce(UnityEngine.Random.insideUnitSphere * initialImpulseForce, ForceMode.Force);
            chunkPropertyBocks[i] = new MaterialPropertyBlock();
            chunk.OnCollision    += OnCollision;
        }

        fingertips = new Fingertip[fingers.Length];
        for (int i = 0; i < fingertips.Length; i++)
        {
            Fingertip ft = new Fingertip();
            ft.Heat  = 0;
            ft.Block = new MaterialPropertyBlock();
            //ft.Rigidbody = fingers[i].GetComponentInChildren<Rigidbody>();
            ft.Renderer         = fingers[i].GetComponentInChildren <MeshRenderer>();
            ft.Particles        = fingers[i].GetComponentInChildren <ParticleSystem>();
            ft.Emission         = ft.Particles.emission;
            ft.Emission.enabled = false;
            fingertips[i]       = ft;
        }
    }
コード例 #7
0
    private void PrepareForUpdate()
    {
        // Gather all the info we can only get in the main thread
        cameraPos = CameraCache.Main.transform.position;
        cameraUp  = CameraCache.Main.transform.up;
        cameraFwd = CameraCache.Main.transform.forward;
        cameraRht = CameraCache.Main.transform.right;

        totalDistortionTarget = 0;
        for (int i = 0; i < fingers.Length; i++)
        {
            Transform finger = fingers[i];
            Force     force  = forces[i];
            force.PrevPoint = force.Point;
            force.Radius    = fingertipRadius;
            if (!finger.gameObject.activeSelf)
            {
                force.Active = false;
            }
            else
            {
                if (!force.Active)
                {
                    force.Velocity = Vector3.zero;
                }
                else
                {
                    force.Velocity = force.Point - finger.position;
                }
                force.Point  = finger.position;
                force.Active = true;

                if (force.IsIntersecting)
                {
                    totalDistortionTarget += force.Velocity.magnitude;
                }
            }

            if (force.IsIntersecting)
            {
                if (!force.WasIntersecting)
                {
                    force.WasIntersecting = true;
                    fingertips[i].PingAudio.Play();
                }
            }
            else
            {
                force.WasIntersecting = false;
            }

            forces[i] = force;
        }

        if (totalDistortion < totalDistortionTarget)
        {
            totalDistortion = totalDistortionTarget;
        }
        else
        {
            totalDistortion = Mathf.Lerp(totalDistortion, totalDistortionTarget, Time.deltaTime * distortionFadeSpeed);
        }

        for (int i = 0; i < fingertips.Length; i++)
        {
            Force     force     = forces[i];
            Fingertip fingertip = fingertips[i];
            float     velocity  = force.Velocity.magnitude * fingertipVelocityColor;
            fingertip.Color = Color.Lerp(fingertip.Color, fingertipColor.Evaluate(velocity), Time.deltaTime);
            fingertip.Block.SetColor("_Color", fingertip.Color);
            fingertip.Mesh.SetPropertyBlock(fingertip.Block);
            fingertip.Trail.SetPropertyBlock(fingertip.Block);
            fingertips[i] = fingertip;
        }

        time            = Time.time;
        deltaTime       = Time.time - timeLastUpdated;
        timeLastUpdated = time;
    }
コード例 #8
0
    public override void Initialize(Vector3 surfacePosition)
    {
        base.Initialize(surfacePosition);

        ISceneTransitionService transitionService;

        if (MixedRealityServiceRegistry.TryGetService <ISceneTransitionService>(out transitionService))
        {
            transitionService.OnTransitionStarted += OnTransitionStarted;
        }

        tileScale   = 1f / numColumns;
        tileOffsets = new Vector2[numTiles];

        int tileNum = 0;

        for (int row = 0; row < numRows; row++)
        {
            for (int column = 0; column < numColumns; column++)
            {
                Vector2 uv = Vector2.zero;
                uv.x = tileScale * column;
                uv.y = (tileScale * -row) - tileScale;
                tileOffsets[tileNum] = uv;

                tileNum++;
                if (tileNum >= numTiles)
                {
                    break;
                }
            }

            if (tileNum >= numTiles)
            {
                break;
            }
        }

        noise = new FastSimplexNoise();

        transitionColor = Color.black;

        forces      = new Force[fingers.Length];
        fingertips  = new Fingertip[fingers.Length];
        wisps       = new Wisp[numWisps];
        quads       = new Quad[numWisps];
        finalQuads  = new Quad[numWisps];
        renderOrder = new List <RenderOrder>(numWisps);

        for (int i = 0; i < numWisps; i++)
        {
            Wisp wisp = new Wisp();
            wisp.TargetPoint  = SurfacePosition + (Random.insideUnitSphere * SurfaceRadius);
            wisp.Point        = wisp.TargetPoint;
            wisp.Velocity     = Random.insideUnitSphere * initialVelocity;
            wisp.TargetRadius = Mathf.Lerp(wispSize.x, wispSize.y, (float)noise.Evaluate(wisp.Point.x, wisp.Point.y, wisp.Point.z));
            wisp.Radius       = wisp.TargetRadius;
            wisp.TileOffset   = Random.Range(0, numTiles);
            wisps[i]          = wisp;

            Quad quad = Quad.FromWisp(baseWispColor.Evaluate(Random.Range(0f, 1f)), wisp.Point, wisp.Radius, Vector3.up, Vector3.right, tileOffsets[wisp.TileOffset], tileScale);
            quad.Color    = transitionColor;
            quads[i]      = quad;
            finalQuads[i] = quads[i];

            RenderOrder r = new RenderOrder();
            renderOrder.Add(r);
        }

        for (int i = 0; i < fingers.Length; i++)
        {
            Transform finger    = fingers[i];
            Fingertip fingertip = fingertips[i];
            fingertip.Block     = new MaterialPropertyBlock();
            fingertip.Trail     = finger.GetComponentInChildren <TrailRenderer>();
            fingertip.Mesh      = finger.GetComponentInChildren <MeshRenderer>();
            fingertip.PingAudio = finger.GetComponentInChildren <AudioSource>();
            fingertips[i]       = fingertip;
        }

        Camera.onPostRender += PostRender;

        updateWisps = true;
        Task task = UpdateWispsTask();
    }