public void VariableSettings(BaseInteraction target) { GUILayout.Label("Variable conditions", EditorStyles.boldLabel); if(target.variableKey.Length > 0 || target.numberVarKey.Length > 0) { target.needed = (AIConditionNeeded)EditorGUILayout.EnumPopup("Needed", target.needed); target.autoDestroyOnVariables = EditorGUILayout.Toggle("Auto destroy", target.autoDestroyOnVariables); } if(GUILayout.Button("Add Variable", GUILayout.Width(150))) { target.AddVariableCondition(); } if(target.variableKey.Length > 0) { for(int i=0; i<target.variableKey.Length; i++) { EditorGUILayout.BeginHorizontal(); if(GUILayout.Button("Remove", GUILayout.Width(75))) { target.RemoveVariableCondition(i); return; } target.checkType[i] = EditorGUILayout.Toggle(target.checkType[i], GUILayout.Width(20)); target.variableKey[i] = EditorGUILayout.TextField(target.variableKey[i]); if(target.checkType[i]) GUILayout.Label("== "); else GUILayout.Label(" != "); target.variableValue[i] = EditorGUILayout.TextField(target.variableValue[i]); EditorGUILayout.EndHorizontal(); } } if(GUILayout.Button("Add Number Variable", GUILayout.Width(150))) { target.AddNumberVariableCondition(); } if(target.numberVarKey.Length > 0) { for(int i=0; i<target.numberVarKey.Length; i++) { EditorGUILayout.BeginHorizontal(); if(GUILayout.Button("Remove", GUILayout.Width(75))) { target.RemoveNumberVariableCondition(i); return; } target.numberCheckType[i] = EditorGUILayout.Toggle(target.numberCheckType[i], GUILayout.Width(20)); target.numberVarKey[i] = EditorGUILayout.TextField(target.numberVarKey[i]); if(!target.numberCheckType[i]) GUILayout.Label("not"); target.numberValueCheck[i] = (ValueCheck)EditorGUILayout.EnumPopup(target.numberValueCheck[i]); target.numberVarValue[i] = EditorGUILayout.FloatField(target.numberVarValue[i]); EditorGUILayout.EndHorizontal(); } } if(GUI.changed) EditorUtility.SetDirty(target); }
private void OnInteractiveObjectStateChanged(Object p_sender, EventArgs p_args) { BaseObjectEventArgs baseObjectEventArgs = p_args as BaseObjectEventArgs; if (baseObjectEventArgs != null && baseObjectEventArgs.Object == MyController) { m_interaction = (BaseInteraction)p_sender; ObjectState(MyController.State == EInteractiveObjectState.LEVER_DOWN, false); } }
private void OnDoorStateChanged(Object p_sender, EventArgs p_args) { DoorEntityEventArgs doorEntityEventArgs = (DoorEntityEventArgs)p_args; if (doorEntityEventArgs.Animate && doorEntityEventArgs.Object == MyController) { m_interaction = (BaseInteraction)p_sender; ObjectState(doorEntityEventArgs.TargetState == EInteractiveObjectState.DOOR_OPEN, false); } }
private void OnInteractiveObjectStateChanged(Object p_sender, EventArgs p_args) { BaseObjectEventArgs baseObjectEventArgs = p_args as BaseObjectEventArgs; if (baseObjectEventArgs != null && baseObjectEventArgs.Object == MyController) { m_interaction = (BaseInteraction)p_sender; m_state = !m_state; ObjectState(m_state); } }
void OnInteractionTriggerExit(ChildCollider callingChildCollider, Collider other) { BaseInteraction interactable = other.gameObject.GetComponent <BaseInteraction>(); if (interactable) { overlappingInteractables.Remove(other); if (overlappingInteractables.Count <= 0 && selectedInteractable) { selectedInteractable.OnDeselected(); selectedInteractable = null; } } }
void OnInteractionTriggerEnter(ChildCollider callingChildCollider, Collider other) { BaseInteraction interactable = other.gameObject.GetComponent <BaseInteraction>(); if (interactable) { overlappingInteractables.Add(other); if (overlappingInteractables.Count < 2) { selectedInteractable = interactable; selectedInteractable.OnSelected(); } } return; }
private void OnDoorStateChanged(Object p_sender, EventArgs p_args) { DoorEntityEventArgs doorEntityEventArgs = (DoorEntityEventArgs)p_args; if (doorEntityEventArgs.Animate && doorEntityEventArgs.Object == MyController) { m_interaction = (BaseInteraction)p_sender; if (doorEntityEventArgs.TargetState == EInteractiveObjectState.DOOR_OPEN || doorEntityEventArgs.TargetState == EInteractiveObjectState.DOOR_CLOSED) { ObjectState(doorEntityEventArgs.TargetState, true); } else { Debug.LogError("Secret Door State Change - Wrong TargetState: " + doorEntityEventArgs.TargetState); } } }
public void EventStartSettings(BaseInteraction target) { target.startType = (EventStartType)EditorGUILayout.EnumPopup("Start type", target.startType); if(EventStartType.INTERACT.Equals(target.startType)) { target.maxMouseDistance = EditorGUILayout.FloatField("Max mouse distance", target.maxMouseDistance); } else if(EventStartType.KEY_PRESS.Equals(target.startType)) { target.keyToPress = EditorGUILayout.TextField("Key to press", target.keyToPress); target.keyPressInTrigger = EditorGUILayout.Toggle("In trigger", target.keyPressInTrigger); } else if(EventStartType.DROP.Equals(target.startType)) { target.dropType = (ItemDropType)EditorGUILayout.EnumPopup("Item type", target.dropType); if(ItemDropType.ITEM.Equals(target.dropType)) { target.dropID = EditorGUILayout.Popup("Item", target.dropID, DataHolder.Items().GetNameList(true)); } else if(ItemDropType.WEAPON.Equals(target.dropType)) { target.dropID = EditorGUILayout.Popup("Weapon", target.dropID, DataHolder.Weapons().GetNameList(true)); } else if(ItemDropType.ARMOR.Equals(target.dropType)) { target.dropID = EditorGUILayout.Popup("Armor", target.dropID, DataHolder.Armors().GetNameList(true)); } target.consumeDrop = EditorGUILayout.Toggle("Consume item", target.consumeDrop); } if(GUI.changed) EditorUtility.SetDirty(target); }
/// <summary> /// 인스펙터에서 공통적으로 사용될 Editor UI 함수 - 시작 타입 설정하는 곳에 사용됨. /// </summary> /// <param name="p_Target"></param> public void EventStartSettings(BaseInteraction p_Target) { //+ 시작 타입을 지정. p_Target.startType = (EventStartType)EditorGUILayout.EnumPopup("Start type", p_Target.startType); //+ 만약 마우스 클릭이나 터치가 시작타입이라면 클릭영역 크기를 지정. if (EventStartType.INTERACT.Equals(p_Target.startType)) { p_Target.maxMouseDistance = EditorGUILayout.FloatField("Max mouse distance", p_Target.maxMouseDistance); } //+ 만약 시작타입이 키입력이라면 입력 키를 지정할 수 있다. else if (EventStartType.KEY_PRESS.Equals(p_Target.startType)) { p_Target.keyToPress = EditorGUILayout.TextField("Key to press", p_Target.keyToPress); //ex) p,space,alpha1.. p_Target.keyPressInTrigger = EditorGUILayout.Toggle("In trigger", p_Target.keyPressInTrigger); } //+ 수정되었다면 Dirty를 발생시켜 적용시켜 준다. if (GUI.changed) { EditorUtility.SetDirty(p_Target); } }
public override void Execute(Grid p_grid) { m_allSatisfied = (m_conditions.Count > 0); foreach (ObjectCondition objectCondition in m_conditions) { InteractiveObject interactiveObject = p_grid.FindInteractiveObject(objectCondition.id); if (interactiveObject == null) { m_allSatisfied = false; break; } if (interactiveObject.State != objectCondition.wantedState) { m_allSatisfied = false; break; } } EInteractionTiming einteractionTiming = EInteractionTiming.ON_FAIL; if (m_allSatisfied) { einteractionTiming = EInteractionTiming.ON_SUCCESS; } for (Int32 i = 0; i < Commands.Count; i++) { SpawnCommand spawnCommand = Commands[i]; if ((spawnCommand.Timing == einteractionTiming || spawnCommand.Timing == EInteractionTiming.ON_EXECUTE) && (spawnCommand.ActivateCount == -1 || spawnCommand.ActivateCount > 0)) { BaseInteraction baseInteraction = InteractionFactory.Create(this, spawnCommand, SpawnerID, i); if (baseInteraction.Valid && (spawnCommand.RequiredState == EInteractiveObjectState.NONE || StateIsMatching(spawnCommand, baseInteraction))) { Interactions.Add(baseInteraction); } } m_stateMachine.ChangeState(EState.IDLE); } if (einteractionTiming == EInteractionTiming.ON_SUCCESS && QuestObjectives != null && QuestObjectives.Count > 0) { LegacyLogic.Instance.WorldManager.QuestHandler.ObjectInteraction(this); } }
private void HandleInteractionStrategy() { switch (interactionOption) { case InteractionOption.Custom: if (interactionBehaviour == null) { Debug.LogError("No BaseInteraction assigned to Interactable", gameObject); } if (noItemInteractionBehaviour == null && addNoRequiredItemInteraction) { Debug.LogError("No BaseInteraction for no Item assigned to Interactable", gameObject); } break; case InteractionOption.CustomAuto: interactionBehaviour = gameObject.GetComponent <BaseInteraction>(); if (interactionBehaviour == null) { Debug.LogError("No Script with BaseInteraction on Object to be auto added to Interactable", gameObject); } break; case InteractionOption.ConsoleLog: interactionBehaviour = gameObject.AddComponent <ConsoleInteraction>(); break; case InteractionOption.Rotate: interactionBehaviour = gameObject.AddComponent <RotateInteraction>(); break; case InteractionOption.Empty: interactionBehaviour = gameObject.AddComponent <EmptyInteraction>(); break; default: interactionBehaviour = gameObject.AddComponent <EmptyInteraction>(); break; } }
private void UpdateName(InteractiveObject p_interactiveObject) { Boolean flag = false; IEnumerable <InteractiveObjectTooltipStaticData> iterator = StaticDataHandler.GetIterator <InteractiveObjectTooltipStaticData>(EDataType.INTERACTIVE_OBJECT_TOOLTIPS); KeyCode keyCode = KeyConfigManager.KeyBindings[EHotkeyType.INTERACT].Key1; if (keyCode == KeyCode.None) { keyCode = KeyConfigManager.KeyBindings[EHotkeyType.INTERACT].AltKey1; } String text = m_actionColorHex + "[" + LocaManager.GetText("OPTIONS_INPUT_KEYNAME_" + keyCode.ToString().ToUpper()) + "][-]"; if (!String.IsNullOrEmpty(p_interactiveObject.Prefab)) { String directoryName = Path.GetDirectoryName(p_interactiveObject.Prefab); foreach (InteractiveObjectTooltipStaticData interactiveObjectTooltipStaticData in iterator) { if (interactiveObjectTooltipStaticData.PrefabFolder == directoryName || interactiveObjectTooltipStaticData.PrefabFolder == p_interactiveObject.Prefab) { m_label.text = LocaManager.GetText(interactiveObjectTooltipStaticData.LocaKey, text); flag = true; break; } } } if (p_interactiveObject is Button) { if (!flag) { m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_BUTTON", text); } return; } if (p_interactiveObject is Lever) { if (!flag) { m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_LEVER", text); } return; } if (!(p_interactiveObject is Barrel)) { if (p_interactiveObject is Container) { Container container = p_interactiveObject as Container; if (!container.IsEmpty()) { if (!flag) { m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_CONTAINER", text); } } else { foreach (SpawnCommand spawnCommand in container.Commands) { if (spawnCommand.Type == EInteraction.CHANGE_ATTRIBUTE) { m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_CONTAINER", text); return; } } m_label.text = String.Empty; } return; } if (p_interactiveObject is Door) { if (LegacyLogic.Instance.WorldManager.Party.SelectedInteractiveObject == null || p_interactiveObject.IsSecret) { m_label.text = String.Empty; return; } if (((Door)p_interactiveObject).State == EInteractiveObjectState.DOOR_OPEN) { m_label.text = String.Empty; } else { m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_DOOR", text); } return; } else { if (p_interactiveObject is Sign) { if (!flag) { m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_SIGN", text); } return; } if (p_interactiveObject is Entrance) { if (flag) { return; } Entrance entrance = (Entrance)p_interactiveObject; String text2 = entrance.MinimapTooltipLocaKey; if (!String.IsNullOrEmpty(text2)) { text2 = LocaManager.GetText(entrance.MinimapTooltipLocaKey); m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_ENTRANCE", text, text2); return; } text2 = null; foreach (SpawnCommand spawnCommand2 in entrance.Commands) { if (spawnCommand2.Type == EInteraction.USE_ENTRANCE) { String[] array = spawnCommand2.Extra.Split(new Char[] { ',' }); text2 = array[0].Replace(".xml", String.Empty); break; } } if (text2 != null) { GridInfo gridInfo = LegacyLogic.Instance.MapLoader.FindGridInfo(text2); if (gridInfo != null) { text2 = LocaManager.GetText(gridInfo.LocationLocaName); if (LegacyLogic.Instance.MapLoader.Grid.Type == EMapType.DUNGEON) { text2 = text2.Replace("@", ", "); } else if (text2.LastIndexOf('@') != -1) { text2 = text2.Remove(text2.LastIndexOf('@')); } m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_ENTRANCE", text, text2); return; } Debug.LogError("Grid Info not found " + text2); } } else if (p_interactiveObject is NpcContainer) { NpcContainer npcContainer = (NpcContainer)p_interactiveObject; if (!npcContainer.IsEnabled) { m_label.text = String.Empty; return; } String minimapTooltipLocaKey = npcContainer.MinimapTooltipLocaKey; if (!String.IsNullOrEmpty(npcContainer.IndoorScene)) { if (!String.IsNullOrEmpty(minimapTooltipLocaKey)) { String text3 = LocaManager.GetText(minimapTooltipLocaKey); m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_BUILDING_DEFAULT", text, text3); return; } foreach (InteractiveObjectTooltipStaticData interactiveObjectTooltipStaticData2 in iterator) { if (interactiveObjectTooltipStaticData2.PrefabFolder == npcContainer.IndoorScene) { m_label.text = LocaManager.GetText(interactiveObjectTooltipStaticData2.LocaKey, text); return; } } m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_INDOOR_CONTEXT", text); return; } else { if (!npcContainer.Npcs[0].IsEnabled) { m_label.text = String.Empty; return; } foreach (SpawnCommand spawnCommand3 in npcContainer.Commands) { if (spawnCommand3.Type == EInteraction.START_DEFINED_DIALOG && !String.IsNullOrEmpty(spawnCommand3.Precondition) && spawnCommand3.Precondition.StartsWith("PARTY_CHECK")) { BasePrecondition basePrecondition = BaseInteraction.ParsePrecondition(spawnCommand3.Precondition); if (basePrecondition is PartyCheckPrecondition && !((PartyCheckPrecondition)basePrecondition).Evaluate()) { m_label.text = String.Empty; return; } } } if (flag) { return; } if (!String.IsNullOrEmpty(minimapTooltipLocaKey)) { m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_NPC", text, minimapTooltipLocaKey); return; } if (npcContainer.Npcs[0].StaticID != 224 && npcContainer.Npcs[0].StaticID != 225) { String text4 = LocaManager.GetText(npcContainer.Npcs[0].StaticData.NameKey); m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_NPC", text, text4); return; } } } else if (p_interactiveObject is RechargingObject) { RechargingObject rechargingObject = (RechargingObject)p_interactiveObject; if (rechargingObject.IsFountain()) { m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_FOUNTAIN", text); } else if (rechargingObject.IsCrystal()) { m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_CRYSTAL", text); } else { m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_STATUE", text); } return; } m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_FALLBACK", text); } return; } Barrel barrel = p_interactiveObject as Barrel; if (barrel.State == EInteractiveObjectState.BARREL_EMPTY) { m_label.text = String.Empty; return; } if (barrel.State == EInteractiveObjectState.BARREL_OPEN) { m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_FALLBACK", text); return; } m_label.text = LocaManager.GetText("INTERACT_TOOLTIP_BARREL", text); }
// Update is called once per frame void Update() { // Cache local variables Vector3 movementAcceleration = Vector3.zero; float deltaTime = Time.deltaTime; bool moveAxisPressed = PlayerInputManager.PlayerActions.moveAxis.IsPressed && CanWalk(); // Update lateral movement if appropriate if (moveAxisPressed || ownerCharacterController.velocity.sqrMagnitude > 0.0f) { // Transform camera space input into world space // If movement is pressed use the pressed direction // Otherwise, use the current velocity Vector3 horizontalDirection; float horizontalAccelerationScalar = 1.0f; if (moveAxisPressed) { Vector2 moveInput = new Vector2(PlayerInputManager.PlayerActions.moveAxis.X, PlayerInputManager.PlayerActions.moveAxis.Y); horizontalDirection = ownerCamera.transform.TransformDirection(new Vector3(moveInput.x, 0.0f, moveInput.y)); horizontalDirection.y = 0.0f; horizontalAccelerationScalar = Mathf.Clamp(moveInput.magnitude, -1.0f, 1.0f); } else { horizontalDirection = new Vector3(ownerCharacterController.velocity.x, 0.0f, ownerCharacterController.velocity.z); } if (horizontalDirection != Vector3.zero) { // Normalize to get the final movement direction horizontalDirection.Normalize(); // Get the acceleration based on the movement direction movementAcceleration = GetHorizontalAcceleration(horizontalDirection, horizontalAccelerationScalar, deltaTime); // Rotate towards the movement direction transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.LookRotation(horizontalDirection), movementTurningSpeed * deltaTime); } characterAnimator.SetBool(walkAnimKey, true); } else { characterAnimator.SetBool(walkAnimKey, false); } // Update jump state if (ownerCharacterController.isGrounded) { // Start when pressed if (PlayerInputManager.PlayerActions.jump.WasPressed && CanJump()) { verticalSpeed = jumpAcceleration; fatJumping = true; jumpStartTimeStamp = Time.time; characterAnimator.SetBool(jumpAnimKey, true); } // Stop when on the ground else { verticalSpeed = -gravity; fatJumping = false; characterAnimator.SetBool(jumpAnimKey, false); } } // Update falling state else { // Update fat jumping if (fatJumping) { // End fat jump when jump released or we go beyond the maximum time if (!PlayerInputManager.PlayerActions.jump.IsPressed || Time.time - jumpStartTimeStamp > fatJumpTime) { fatJumping = false; verticalSpeed -= gravity * Time.deltaTime; } // Otherwise, continue fat jumping // Do nothing in that case } // Handle gradual deceleration else { // Double deceleration at jump maximum verticalSpeed -= gravity * deltaTime * (verticalSpeed < 0.0f ? 2.0f : 1.0f); } } // Combine and apply horizontal and vertical movement movementAcceleration.y = verticalSpeed * deltaTime; if (movementAcceleration != Vector3.zero) { ownerCharacterController.Move(movementAcceleration); } // Update the best interactable if appropriate if (overlappingInteractables.Count > 1) { // Find the interactable we are closest to BaseInteraction bestInteractable = null; float smallestDistance = 9999.0f; foreach (Collider interactable in overlappingInteractables) { float distanceToInteractable = Vector3.Distance(ownerCharacterController.transform.position, interactable.transform.position); if (distanceToInteractable < smallestDistance) { bestInteractable = interactable.gameObject.GetComponent <BaseInteraction>(); smallestDistance = distanceToInteractable; } } // Update our best interactable if (bestInteractable != selectedInteractable) { // Deselect old best if (selectedInteractable) { selectedInteractable.OnDeselected(); } // Select new best selectedInteractable = bestInteractable; if (selectedInteractable) { selectedInteractable.OnSelected(); } } } // Interact with selected interactable if appropriate if (PlayerInputManager.PlayerActions.interact.WasPressed && selectedInteractable && CanInteract()) { selectedInteractable.TryInteract(); for (int i = 0; i < overlappingInteractables.Count; i++) { if (selectedInteractable.gameObject.name == overlappingInteractables[i].gameObject.name) { EnableDisable overlap = overlappingInteractables[i].GetComponent <EnableDisable>(); for (int x = 0; x < overlap.toDisable.Length; x++) { if (overlap.toDisable[x].gameObject.name == selectedInteractable.gameObject.name) { overlappingInteractables.RemoveAt(i); } } } } } }
public IInteractionService RegisterAction(BaseInteraction Action) { actions.Add(Action); return(this); }
/// <summary> /// 인스펙터에서 공통적으로 사용될 Editor UI함수 - 시작 값이나 필요 값들을 설정하는 곳에 사용됨. /// </summary> /// <param name="p_Target"></param> public void VariableSettings(BaseInteraction p_Target) { //+ 타이틀. GUILayout.Label("Variable conditions", EditorStyles.boldLabel); //+ 필요 조건과 조건이 일회성으로 자동 삭제 될것인지 설정. if (p_Target.variableKey.Length > 0 || p_Target.numberVarKey.Length > 0) { p_Target.needed = (AIConditionNeeded)EditorGUILayout.EnumPopup("Needed", p_Target.needed); p_Target.autoDestroyOnVariables = EditorGUILayout.Toggle("Auto destroy", p_Target.autoDestroyOnVariables); } //+ 값 추가 버튼. if (GUILayout.Button("Add Variable", GUILayout.Width(150))) { p_Target.AddVariableCondition(); } if (p_Target.variableKey.Length > 0) { for (int i = 0; i < p_Target.variableKey.Length; i++) { EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Remove", GUILayout.Width(75))) { p_Target.RemoveVariableCondition(i); return; } //+값 설정. p_Target.checkType[i] = EditorGUILayout.Toggle(p_Target.checkType[i], GUILayout.Width(20)); p_Target.variableKey[i] = EditorGUILayout.TextField(p_Target.variableKey[i]); if (p_Target.checkType[i]) { GUILayout.Label("== "); } else { GUILayout.Label(" != "); } p_Target.variableValue[i] = EditorGUILayout.TextField(p_Target.variableValue[i]); EditorGUILayout.EndHorizontal(); } } //+ 숫자 값 추가. if (GUILayout.Button("Add Number Variable", GUILayout.Width(150))) { p_Target.AddNumberVariableCondition(); } if (p_Target.numberVarKey.Length > 0) { for (int i = 0; i < p_Target.numberVarKey.Length; i++) { EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Remove", GUILayout.Width(75))) { p_Target.RemoveNumberVariableCondition(i); return; } //+ 숫자 값 설정. p_Target.numberCheckType[i] = EditorGUILayout.Toggle(p_Target.numberCheckType[i], GUILayout.Width(20)); p_Target.numberVarKey[i] = EditorGUILayout.TextField(p_Target.numberVarKey[i]); if (!p_Target.numberCheckType[i]) { GUILayout.Label("not"); } p_Target.numberValueCheck[i] = (ValueCheck)EditorGUILayout.EnumPopup(p_Target.numberValueCheck[i]); p_Target.numberVarValue[i] = EditorGUILayout.FloatField(p_Target.numberVarValue[i]); EditorGUILayout.EndHorizontal(); } } //+ 수정된 것이 있다면 Dirty를 발생시켜 화면에 적용시켜 준다. if (GUI.changed) { EditorUtility.SetDirty(p_Target); } }