private void closeCurrentSelectionMenu() { if (aSelectionMenuIsOpen) { if (selectedWorldObject != null) { InteractableObjectScript unselectedWorldObject = selectedWorldObject; selectedWorldObject = null; GameObject.FindGameObjectWithTag("SelectedObjectMenu_UIText").GetComponent <SelectedObjectMenuScript>().closeMenu(); // check if mouse is still over object RaycastHit mouseRayHit; Ray mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(mouseRay, out mouseRayHit)) { InteractableObjectScript hitObjectInteractionScript = mouseRayHit.collider.GetComponent <InteractableObjectScript>(); if (hitObjectInteractionScript == unselectedWorldObject) { setHighlightedWorldObject(hitObjectInteractionScript); } } } if (selectedInventoryItem != null) { selectedInventoryItem.closeItemMenu(); selectedInventoryItem = null; } aSelectionMenuIsOpen = false; } }
public void checkIfMouseHighlightingObject() { // resets mouse ray and sets highlighted object to null if an object is deactivated while mouse is hovering over it stopHighlightingWorldObject(highlightedWorldObject); RaycastHit mouseRayHit; Ray mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(mouseRay, out mouseRayHit)) { InteractableObjectScript hitObjectInteractionScript = mouseRayHit.collider.GetComponent <InteractableObjectScript>(); setHighlightedWorldObject(hitObjectInteractionScript); } }
public void objectClicked(InteractableObjectScript objectScript, Vector3 position) { // close menu if already open closeMenu(); currentObjectScript = objectScript; GetComponent <Text>().enabled = true; nameOfCurrentObject = objectScript.data.actorName; GetComponent <Text>().text = nameOfCurrentObject; transform.position = position; currentPossibleInteractions = objectScript.interactions; numberOfInteractionsForCurrentObject = objectScript.numberOfInteractions; for (int i = 0; i < objectScript.numberOfInteractions; i++) { interactionButtons[i].gameObject.SetActive(true); switch (objectScript.interactions[i]) { case InteractableObjectScript.InteractionType.Examine: interactionButtons[i].GetComponent <Image>().sprite = examineButtonSprite; break; case InteractableObjectScript.InteractionType.GoTo: interactionButtons[i].GetComponent <Image>().sprite = goToButtonSprite; break; case InteractableObjectScript.InteractionType.PickUp: interactionButtons[i].GetComponent <Image>().sprite = pickUpButtonSprite; break; case InteractableObjectScript.InteractionType.TalkTo: interactionButtons[i].GetComponent <Image>().sprite = talkToButtonSprite; break; case InteractableObjectScript.InteractionType.Use: interactionButtons[i].GetComponent <Image>().sprite = useButtonSprite; break; case InteractableObjectScript.InteractionType.Separate: interactionButtons[i].GetComponent <Image>().sprite = separateButtonSprite; break; } if (objectScript.numberOfInteractions == 2) { interactionButtons[i].transform.position = new Vector2(position.x - (gapBetweenButtons / 2) + (i * gapBetweenButtons), position.y + 30); } else if (objectScript.numberOfInteractions == 3) { interactionButtons[i].transform.position = new Vector2(position.x - gapBetweenButtons + (i * gapBetweenButtons), position.y + 30); } } }
public bool combineActors(ItemInteractionScript inventorySlotOfFirstItem, InteractableObjectScript worldObjectCombinedWith) { bool actorsNeedSwitching = false; // check if these actors can be combined int indexOfSecondActor = getIndexOfSecondActor(inventorySlotOfFirstItem.dataOfItemInSlot, worldObjectCombinedWith.data); if (indexOfSecondActor == -1) { // switch first actor and second actor and check again indexOfSecondActor = getIndexOfSecondActor(worldObjectCombinedWith.data, inventorySlotOfFirstItem.dataOfItemInSlot); if (indexOfSecondActor == -1) { return(false); } else { // switch the actors around actorsNeedSwitching = true; } } ActorData firstActorData; ActorData secondActorData; if (actorsNeedSwitching) { firstActorData = worldObjectCombinedWith.data; secondActorData = inventorySlotOfFirstItem.dataOfItemInSlot; } else { firstActorData = inventorySlotOfFirstItem.dataOfItemInSlot; secondActorData = worldObjectCombinedWith.data; } // remove actors if necessary if (firstActorData.actorsThisCanBeCombinedWith[indexOfSecondActor].outcomeForThisActor == ActorData.ActorOutcomeAfterCombination.Deactivate) { FindObjectOfType <InventoryScript>().removeItem(firstActorData); } if (firstActorData.actorsThisCanBeCombinedWith[indexOfSecondActor].outcomeForOtherActor == ActorData.ActorOutcomeAfterCombination.Deactivate) { currentScene.deactivateWorldObject(worldObjectCombinedWith.gameObject); } resolveComination(firstActorData, secondActorData, indexOfSecondActor); return(true); }
public void stopHighlightingWorldObject(InteractableObjectScript worldObject) { if (highlightedWorldObject == worldObject) { highlightedWorldObject = null; if (!combiningInProgress) { UI_nameOfHighlightedObject.GetComponent <Text>().enabled = false; } else { UI_nameOfHighlightedObject.GetComponent <Text>().text = "Combine with ..."; } } }
public bool separateActor(InteractableObjectScript worldObjectToSeparate) { // splits previously combined world object into components ActorData objectToSeparateData = worldObjectToSeparate.data; if (!resolveSeparation(objectToSeparateData)) { Debug.Log("separation failed"); return(false); // return false if separation is not possible } currentScene.deactivateWorldObject(worldObjectToSeparate.gameObject); return(true); }
public void worldObjectClickedOn(InteractableObjectScript worldObject) { if (combiningInProgress) { setQueuedAction(worldObject.gameObject, InteractableObjectScript.InteractionType.Combine); combiningInProgress = false; setHighlightedWorldObject(worldObject); } else { closeCurrentSelectionMenu(); selectedWorldObject = worldObject; GameObject.FindGameObjectWithTag("SelectedObjectMenu_UIText").GetComponent <SelectedObjectMenuScript>().objectClicked(selectedWorldObject.GetComponent <InteractableObjectScript>(), new Vector3(Input.mousePosition.x, Input.mousePosition.y + 20, Input.mousePosition.z)); aSelectionMenuIsOpen = true; if (worldObject == highlightedWorldObject) { stopHighlightingWorldObject(highlightedWorldObject); } } }
void updateTargets_Interactable(List <string> targetList) { /* * foreach(InteractableObjectScript i in targetInteractable) * { * i.setOutline(0f, Color.white); * } * targetInteractable = new List<InteractableObjectScript>(); */ if (interactTarget != null) { interactTarget.setOutline(0f, Color.white); } interactTarget = null; Vector2 dis = (targetPosition - (Vector2)transform.position); RaycastHit2D hit = Physics2D.Raycast(transform.position, dis.normalized, dis.magnitude, layerMask_interactable); if (hit) { interactTarget = hit.collider.GetComponent <InteractableObjectScript>(); interactTarget.setOutline(1f, Color.white); } /* * foreach (RaycastHit2D h in hits) * { * if (targetList.Contains(h.collider.tag)) * { * targetInteractable.Add(h.collider.GetComponent<InteractableObjectScript>()); * } * } * foreach (InteractableObjectScript i in targetInteractable) * { * i.setOutline(1f, Color.white); * } */ }
//Checks for colliders within a certain distance //currently returns the array in a completely random order, this should be changed to ascending distance order so the closest object will be the interactable one. (shortest to longest) //so when we hit an interactable object we can just exit the foreach loop as we dont need to check further ones. void CheckForInteractions() { //Grabs all colliders within 5 units Collider[] hitColliders = Physics.OverlapSphere(transform.position, 5.0f); //iterator to test if we need to clear the interactableobject int i = 0; foreach (Collider collider in hitColliders) { //Grabs the script from the colliders InteractableObjectScript script = collider.GetComponent <InteractableObjectScript>(); //if there is no script if (script == null) { //increment iterator by one i++; //if i is not equal to the length than continue if (i != hitColliders.Length) { continue; } //else if it is equal to the length clear the interactableobject InteractableObject = null; continue; } //if there is a script this is the new interactable object InteractableObject = collider; } }
public void setHighlightedWorldObject(InteractableObjectScript worldObject) { // don't highlight if object is already selected if (worldObject == selectedWorldObject) { return; } // if the mouse is over a UI element, they shouldn't be able to highlight objects beneath UI if (mouseOverUI) { return; } // clear current highlighted object if (highlightedWorldObject != null) { stopHighlightingWorldObject(highlightedWorldObject); } // set this object as highlighted object if (worldObject != null) { highlightedWorldObject = worldObject; UI_nameOfHighlightedObject.GetComponent <Text>().enabled = true; if (combiningInProgress) { UI_nameOfHighlightedObject.GetComponent <Text>().text = "Combine with " + highlightedWorldObject.data.actorName; } else { UI_nameOfHighlightedObject.GetComponent <Text>().text = highlightedWorldObject.data.actorName; } UI_nameOfHighlightedObject.transform.position = new Vector3(Input.mousePosition.x, Input.mousePosition.y + 20, Input.mousePosition.z); } }
// Start is called before the first frame update void Start() { objectScript = GetComponentInParent <InteractableObjectScript>(); player = GameObject.FindGameObjectWithTag("Player"); }