コード例 #1
0
    public void OnSubPartConnected(GameObject subPartObject, ConveyorPartHandler outsidePartHandler)
    {
        subPartObject.transform.GetChild(1).GetChild(1).GetComponent <Renderer>().enabled = false;
        DropZoneHandler dropZoneHandler = subPartObject.transform.GetChild(1).GetChild(0).GetComponent <DropZoneHandler>();

        dropZoneHandler.SetActiveTriggerLayerMask(0);

        Collider subPartBaseColl = subPartObject.GetComponent <Collider>();

        if (subPartBaseColl != null)
        {
            subPartBaseColl.enabled = true;
        }
        // Disable the extra colls and renderers
        subPartObject.transform.GetChild(0).gameObject.SetActive(true);
        Renderer subPartRenderer = subPartObject.GetComponent <Renderer>();

        if (subPartRenderer != null)
        {
            subPartRenderer.enabled = true;
        }

        acquiredSubPartObjects.Add(subPartObject);

        if (outsidePartHandler != null)
        {
            string[]      previousBasePartTypes = partType.Split(new char[] { '@' });
            List <string> sortedBasePartTypes   = new List <string>(previousBasePartTypes);
            string[]      newBasePartTypes      = outsidePartHandler.GetPartType().Split(new char[] { '@' });
            sortedBasePartTypes.AddRange(newBasePartTypes);

            sortedBasePartTypes.Sort();
            // Update the stored list of base part types to avoid having to do this string parsing more than once
            allAttatchedBasePartTypes = sortedBasePartTypes;

            partType = string.Join("@", sortedBasePartTypes);

            // Free the other part instance
            outsidePartHandler.OnPartConnectedAsSubPart();
        }

        // Update controllers on the potentially changed objects being held
        HandleActiveHeldPartTypeChanged(
            handGrabbingController.GetActiveLeftHandPartHandler(),
            handGrabbingController.GetActiveRightHandPartHandler()
            );

        // Play audio sound effect
        generalSoundEffectPlayer.PlayConnectSound();

        // Check if a complete object has been formed
        if (completedObjectNameByPartType != null && completedObjectNameByPartType.Length == 2)
        {
            if (partType.Equals(completedObjectNameByPartType[0]))
            {
                partType         = completedObjectNameByPartType[1];
                isCompleteObject = true;
            }
        }
    }
コード例 #2
0
    private void CheckForCompletedObject(ConveyorPartHandler objectPartHandler)
    {
        if (!completedHandlersInTrigger.Contains(objectPartHandler))
        {
            if (objectPartHandler != null)
            {
                string objectPartType = objectPartHandler.GetPartType();

                if (buildJobManager.CheckIfValidJobObject(objectPartType))
                {
                    // If object can now be submitted
                    if (objectPartHandler.gameObject.layer == LayerMask.NameToLayer("Grabbable"))
                    {
                        buildJobManager.OnValidObjectSubmitted(objectPartHandler);
                    }
                    completedHandlersInTrigger.Add(objectPartHandler);
                    if (!particleSystemActive)
                    {
                        mainPipeParticleSystem.Play();
                        particleSystemActive = true;
                    }
                }
            }
        }
    }
コード例 #3
0
    public void InitializeHandler()
    {
        dissolveOnContactLayerMask = LayerMask.GetMask(new string[] { "FactoryObject", "Floor", "Wall" });

        originalLayerByChildObject = new Dictionary <Transform, int>();
        RecursiveStoreInitialChildLayer(transform);

        dissolveShader = Shader.Find(dissolveShaderPath);
        if (dissolveShader == null)
        {
            Debug.Log($"WARNING - Unable to find shader: '{dissolveShaderPath}'");
        }

        generalSoundEffectPlayer = FindObjectOfType <GeneralSoundEffectPlayer>();

        partHandler = GetComponent <ConveyorPartHandler>();

        allRBs             = GetComponentsInChildren <Rigidbody>(true);
        allRBInitialMasses = new float[allRBs.Length];
        for (int i = 0; i < allRBs.Length; i++)
        {
            allRBInitialMasses[i] = allRBs[i].mass;
        }

        allObjectRenderers             = GetComponentsInChildren <Renderer>(true);
        allDefaultMaterialsPerRenderer = new List <Material[]>();
        foreach (Renderer objectRenderer in allObjectRenderers)
        {
            // Create copies of all original materials in the renderer
            Material[] rendererMaterials = new Material[objectRenderer.materials.Length];
            for (int i = 0; i < objectRenderer.materials.Length; i++)
            {
                // Make a copy then add it to stored array
                Material newMaterial = new Material(objectRenderer.materials[i]);
                rendererMaterials[i] = newMaterial;
            }

            allDefaultMaterialsPerRenderer.Add(rendererMaterials);
        }

        allDissolveMaterials            = new List <Material>();
        allDissolveMaterialsPerRenderer = new List <Material[]>();
        foreach (Renderer objectRenderer in allObjectRenderers)
        {
            // Create copies of all original materials in the renderer
            Material[] rendererMaterials = new Material[objectRenderer.materials.Length];
            for (int i = 0; i < objectRenderer.materials.Length; i++)
            {
                // Make a copy then change the shader, then add it to stored array
                Material newMaterial = new Material(objectRenderer.materials[i]);
                newMaterial.shader = dissolveShader;
                newMaterial.SetFloat("_DissolveRatio", 0.0f);
                rendererMaterials[i] = newMaterial;

                allDissolveMaterials.Add(newMaterial);
            }

            allDissolveMaterialsPerRenderer.Add(rendererMaterials);
        }
    }
コード例 #4
0
    public void OnLeftHandObjectRelease(XRBaseInteractable inInteractable)
    {
        if (inInteractable == null)
        {
            return;
        }

        if (activeLeftHandPartHandler != null)
        {
            activeLeftHandPartHandler.OnPutDownFromHand();

            activeLeftHandPartHandler.HandleActiveHeldPartTypeChanged(null, null);
            activeLeftHandPartHandler = null;
        }
        if (activeRightHandPartHandler != null)
        {
            activeRightHandPartHandler.HandleActiveHeldPartTypeChanged(activeLeftHandPartHandler, activeRightHandPartHandler);
        }

        leftHandDirectInteractor.interactionLayerMask = defaultLayerMask;

        leftHandDirectInteractor.ForceClearKnownTargets();

        onObjectReleased.Invoke("left");
    }
コード例 #5
0
    // Wait a little while to verify that the object has fully left the drop zone
    private IEnumerator CheckForFullTriggerExitCo()
    {
        yield return(new WaitForSeconds(0.25f));

        dropZoneRenderersObject.SetActive(false);
        objectWithinDropZone        = null;
        objectWithinDropZoneType    = "none";
        checkForFullTriggerExitCoOn = false;
    }
コード例 #6
0
    public void OnObjectDissolve(bool objectSubmittedDissolve = false)
    {
        hasTriggeredDissolve = true;

        if (partHandler != null)
        {
            partHandler = null;
        }

        generalSoundEffectPlayer.PlayObjectDissolveSound(transform);

        gameObject.layer = LayerMask.NameToLayer("DissolvedObject");
        SetChildrenToLayer(transform, LayerMask.NameToLayer("DissolvedObject"));

        if (dissolveShader != null)
        {
            foreach (Rigidbody rb in allRBs)
            {
                rb.useGravity = false;
                rb.mass       = 1.0f;
            }
            randomTorqueDir = Random.insideUnitSphere;

            for (int i = 0; i < allObjectRenderers.Length; i++)
            {
                Renderer objectRenderer = allObjectRenderers[i];
                objectRenderer.materials = allDissolveMaterialsPerRenderer[i];
            }

            Color greenColor = new Color(0, Mathf.Pow(2, 6), 0);
            foreach (Material rendererMaterial in allDissolveMaterials)
            {
                rendererMaterial.SetFloat("_DissolveRatio", 0.0f);
                if (objectSubmittedDissolve)
                {
                    rendererMaterial.SetColor("_GlowColor", greenColor);
                }
            }
            dissolveTween = DOTween.To(
                () => allDissolveMaterials[0].GetFloat("_DissolveRatio"),
                x => {
                foreach (Material rendererMaterial in allDissolveMaterials)
                {
                    rendererMaterial.SetFloat("_DissolveRatio", x);
                }
            },
                1.0f,
                dissolveTime
                ).SetEase(Ease.OutQuad)
                            .OnComplete(() => OnObjectDestroy());
        }
        else
        {
            OnObjectDestroy();
        }
    }
コード例 #7
0
 public void SetActiveTriggerLayerMask(LayerMask newLayerMask)
 {
     if (newLayerMask != activeTriggerLayerMask)
     {
         dropZoneRenderersObject.SetActive(false);
         objectWithinDropZone     = null;
         objectWithinDropZoneType = "none";
     }
     activeTriggerLayerMask = newLayerMask;
 }
コード例 #8
0
 private void OnTriggerEnter(Collider other)
 {
     if (LayerIsInLayerMask(other.gameObject.layer, validObjectLayerMask) &&
         !handlersByValidObjectsInTrigger.ContainsKey(other.gameObject))
     {
         ConveyorPartHandler objectPartHandler = other.gameObject.GetComponentInParent <ConveyorPartHandler>();
         if (objectPartHandler != null)
         {
             handlersByValidObjectsInTrigger.Add(other.gameObject, objectPartHandler);
             CheckForCompletedObject(objectPartHandler);
         }
     }
 }
コード例 #9
0
    private void OnTriggerExit(Collider other)
    {
        if (handlersByValidObjectsInTrigger.ContainsKey(other.gameObject))
        {
            ConveyorPartHandler objectPartHandler = handlersByValidObjectsInTrigger[other.gameObject];
            completedHandlersInTrigger.Remove(objectPartHandler);

            handlersByValidObjectsInTrigger.Remove(other.gameObject);

            if (particleSystemActive && completedHandlersInTrigger.Count <= 0)
            {
                mainPipeParticleSystem.Stop();
                particleSystemActive = false;
            }
        }
    }
コード例 #10
0
    private void OnTriggerStay(Collider other)
    {
        // Check stored objects that have called OnTriggerEnter but not yet OnTriggerExit
        if (LayerIsInLayerMask(other.gameObject.layer, validObjectLayerMask) &&
            handlersByValidObjectsInTrigger.ContainsKey(other.gameObject))
        {
            ConveyorPartHandler objectPartHandler = handlersByValidObjectsInTrigger[other.gameObject];
            CheckForCompletedObject(objectPartHandler);

            if (completedHandlersInTrigger.Contains(objectPartHandler))
            {
                if (objectPartHandler.gameObject.layer == LayerMask.NameToLayer("Grabbable"))
                {
                    buildJobManager.OnValidObjectSubmitted(objectPartHandler);
                }
            }
        }
    }
コード例 #11
0
    public void OnRightHandObjectGrab(XRBaseInteractable inInteractable)
    {
        if (inInteractable == null)
        {
            return;
        }
        activeRightHandPartHandler = inInteractable.GetComponent <ConveyorPartHandler>();
        if (activeRightHandPartHandler != null)
        {
            activeRightHandPartHandler.OnPickedUpByRightHand();

            activeRightHandPartHandler.HandleActiveHeldPartTypeChanged(activeLeftHandPartHandler, activeRightHandPartHandler);
        }
        if (activeLeftHandPartHandler != null)
        {
            activeLeftHandPartHandler.HandleActiveHeldPartTypeChanged(activeLeftHandPartHandler, activeRightHandPartHandler);
        }

        rightHandDirectInteractor.interactionLayerMask = justRightHandPartLayerMask;
    }
コード例 #12
0
    private void SpawnInPrefabInstanceAtRegion(GameObject selectedPrefab, Transform spawnRegion)
    {
        bool       generatedNewInstance         = false;
        GameObject spawnedPartInstance          = SelectInstanceToSpawn(selectedPrefab, ref generatedNewInstance);
        Transform  spawnedPartInstanceTransform = spawnedPartInstance.transform;

        spawnedPartInstanceTransform.position = spawnRegion.position;
        spawnedPartInstanceTransform.rotation = Quaternion.Euler(
            Random.Range(0.0f, 360.0f), Random.Range(0.0f, 360.0f), Random.Range(0.0f, 360.0f));

        ConveyorPartHandler spawnedPartHandler = spawnedPartInstance.GetComponent <ConveyorPartHandler>();

        if (spawnedPartHandler == null)
        {
            Debug.LogError($"{spawnedPartInstance.name}: Did not find ConveyorPartHandler in selected instance within PartsSpawnManager");
            return;
        }
        if (generatedNewInstance)
        {
            spawnedPartHandler.InitializeHandler();
        }
        spawnedPartHandler.OnPartEnabled();
    }
コード例 #13
0
    private void CheckForObjectInTrigger(Collider other)
    {
        if (objectWithinDropZone == null && LayerIsInLayerMask(other.gameObject.layer, activeTriggerLayerMask) &&
            partHandler.CheckIfAttatchedDropZoneCanBeUsed())
        {
            if (checkForFullTriggerExitCoOn && checkForFullTriggerExitCo != null)
            {
                StopCoroutine(checkForFullTriggerExitCo);
                checkForFullTriggerExitCoOn = false;
            }

            dropZoneRenderersObject.SetActive(true);
            objectWithinDropZone = other.transform.GetComponentInParent <ConveyorPartHandler>();
            if (objectWithinDropZone.gameObject.layer == LayerMask.NameToLayer("LeftHandPart"))
            {
                objectWithinDropZoneType = "left";
            }
            if (objectWithinDropZone.gameObject.layer == LayerMask.NameToLayer("RightHandPart"))
            {
                objectWithinDropZoneType = "right";
            }
        }
    }
コード例 #14
0
    public void OnValidObjectSubmitted(ConveyorPartHandler objectPartHandler)
    {
        if (!gameIsActive)
        {
            return;
        }

        string objectType = objectPartHandler.GetPartType();

        if (!activeJobPartTypes.Contains(objectType))
        {
            return;
        }
        TVBoxHandler jobTVBoxHandler = null;

        // Otherwise, find first valid occurances of the object type in job list
        for (int i = 0; i < activeJobPartTypes.Count; i++)
        {
            if (activeJobPartTypes[i].Equals(objectType))
            {
                TVBoxHandler currentJobTVBoxHandler = activeTVBoxHandlers[i];

                if (currentJobTVBoxHandler.CheckIfJobIsActive())
                {
                    jobTVBoxHandler = currentJobTVBoxHandler;
                    break;
                }
            }
        }
        if (jobTVBoxHandler == null)
        {
            Debug.LogWarning("WARNING - Object considered valid was not labeled as active"
                             + $"by any TV box handlers, object='{objectPartHandler.gameObject.name}'");
            return;
        }

        objectPartHandler.OnValidObjectSubmitted();

        totalEarnings += jobTVBoxHandler.OnJobSubmitted();

        totalEarningsText.text = GetEarningsString();

        soundEffectPlayer.PlaySuccessSound();

        currentConveyorSpeed *= 1.05f;
        foreach (ConveyorBeltHandler beltHandler in conveyorBeltHandlers)
        {
            beltHandler.SetSpeed(currentConveyorSpeed);
        }
        mainMusicAudioSource.pitch = Mathf.Clamp(mainMusicAudioSource.pitch * 1.02f, 1.0f, 1.75f);
        //conveyorBeltAudioSource.pitch = Mathf.Clamp(conveyorBeltAudioSource.pitch * 1.02f, 1.0f, 1.5f);

        currentSpawnTimeMultiplier *= 0.95f;
        spawnManager.SetSpawnTimeMultiplier(currentSpawnTimeMultiplier);

        currentTimeMultiplier *= 0.9f;
        foreach (TVBoxHandler boxHandler in tvBoxHandlers)
        {
            boxHandler.SetTimeMultiplier(currentTimeMultiplier);
        }

        currentEarningsMultiplier *= 1.1f;
        foreach (TVBoxHandler boxHandler in tvBoxHandlers)
        {
            boxHandler.SetCurrentEarningsMultiplier(currentEarningsMultiplier);
        }

        Debug.Log($"<color=cyan>SUBMITTED JOB for {objectType}</color>");
    }
コード例 #15
0
 public void SetConnectedConveyorBeltHandler(ConveyorPartHandler partHandler)
 {
     this.partHandler = partHandler;
 }
コード例 #16
0
    public void HandleActiveHeldPartTypeChanged(ConveyorPartHandler activeLeftHandPartHandler, ConveyorPartHandler activeRightHandPartHandler)
    {
        string activeLeftHandPartType = activeLeftHandPartHandler != null?activeLeftHandPartHandler.GetPartType() : "unassigned";

        string activeRightHandPartType = activeRightHandPartHandler != null?activeRightHandPartHandler.GetPartType() : "unassigned";

        foreach (GameObject subPart in subPartInfoByObject.Keys)
        {
            // If this sub part has already been acquired, continue
            if (acquiredSubPartObjects.Contains(subPart))
            {
                continue;
            }

            // If this event occurred while the object was highlighted, don't modify anything, as this should
            // trigger OnSubPartConnected after the release
            if (subPart.transform.GetChild(1).GetChild(1).gameObject.activeSelf)
            {
                continue;
            }

            SubPartInfo subPartInfo = subPartInfoByObject[subPart];

            bool shouldBeSkipped = false;

            // To continue, all required sub part objects must already be attatched to this object
            foreach (GameObject requiredSubPart in subPartInfo.GetRequiredOtherSubPartObjects())
            {
                if (!acquiredSubPartObjects.Contains(requiredSubPart))
                {
                    shouldBeSkipped = true;
                    break;
                }
            }
            if (shouldBeSkipped)
            {
                continue;
            }

            // If this feature is being used
            if (subPartInfo.GetRequiredOneOfOtherSubPartObjects().Count > 0)
            {
                shouldBeSkipped = true;
                // To continue, AT LEAST ONE of these sub part objects must already be attatched to this object
                foreach (GameObject requiredSubPart in subPartInfo.GetRequiredOneOfOtherSubPartObjects())
                {
                    if (acquiredSubPartObjects.Contains(requiredSubPart))
                    {
                        shouldBeSkipped = false;
                        break;
                    }
                }
                if (shouldBeSkipped)
                {
                    continue;
                }
            }

            // To continue, no prohibiting sub parts must already be attatched to this object
            foreach (GameObject prohibitingSubPartObject in subPartInfo.GetProhibitingOtherSubPartObjects())
            {
                if (acquiredSubPartObjects.Contains(prohibitingSubPartObject))
                {
                    shouldBeSkipped = true;
                    break;
                }
            }
            if (shouldBeSkipped)
            {
                continue;
            }

            string subPartType = subPartInfo.GetSubPartType();

            DropZoneHandler dropZoneHandler = subPart.transform.GetChild(1).GetChild(0).GetComponent <DropZoneHandler>();

            // If player is now holding desired part in LEFT hand
            if (activeLeftHandPartType.Equals(subPartType))
            {
                dropZoneHandler.SetActiveTriggerLayerMask(justLeftHandPartLayerMask);
            }
            // Else If player is now holding desired part in RIGHT hand
            else if (activeRightHandPartType.Equals(subPartType))
            {
                dropZoneHandler.SetActiveTriggerLayerMask(justRightHandPartLayerMask);
            }
            // Else if holding in both hands or is not holding the part in either hand
            else
            {
                dropZoneHandler.SetActiveTriggerLayerMask(0);
            }
        }
    }