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; } } }
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; } } } } }
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); } }
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"); }
// 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; }
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(); } }
public void SetActiveTriggerLayerMask(LayerMask newLayerMask) { if (newLayerMask != activeTriggerLayerMask) { dropZoneRenderersObject.SetActive(false); objectWithinDropZone = null; objectWithinDropZoneType = "none"; } activeTriggerLayerMask = newLayerMask; }
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); } } }
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; } } }
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); } } } }
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; }
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(); }
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"; } } }
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>"); }
public void SetConnectedConveyorBeltHandler(ConveyorPartHandler partHandler) { this.partHandler = partHandler; }
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); } } }