public void TryDoAction() { bool canDoAction = false; RaycastHit[] hits = Physics.SphereCastAll(transform.position, _actionRadius, Vector3.up, 10f); foreach (RaycastHit hit in hits) { AControlable controlable = hit.collider.gameObject.GetComponentInParent <AControlable>(); if (controlable && hit.collider.gameObject != gameObject) { foreach (AActionable destActionable in controlable.actionables) { if ((objectType & destActionable.objectActionable) != ObjectType.Undefined) { canDoAction = true; Debug.Log($"ACTION: '{objectType}' is actioning '{controlable.objectType}'."); destActionable.DoAction(); } } } } // Use bool to avoid doing action multiple times if (canDoAction || _hasSelfAction) { DoAction(); DoChildAction(); } }
void SnapObject(AControlable controlable) { Debug.Log("Snap Object"); AControlable refControlable = _refMaison.GetObject(controlable.objectType); StartCoroutine(SnapObjectCoroutine(controlable, refControlable)); }
void CheckObjectState(AControlable controlable) { if (_refMaison.CheckObjectState(controlable) && !IsNeeded(controlable)) { Debug.Log("Object placed properly -> TODO add feedback"); SnapObject(controlable); if (!_refMaison.CheckValidated(controlable)) { return; } controlable.isLocked = true; SoundManager.PlaySound(Random.value > 0.5 ? Random.value > 0.5f ? "snap_1" : "snap_2" : "snap_3", controlable.transform.position); if (_refMaison.CheckObjects(_maisons[_currentHouse])) { Debug.Log("All objects are ok, opening next house."); OpenNextHouse(); if (closeDoorIfValidate) { foreach (var controlableClose in _maisons[_currentHouse - 1]._controlables) { controlableClose.isLocked = true; } } } } }
public virtual bool IsSameState(AControlable controlable) { Vector3 position1 = transform.root.position - transform.position; Vector3 position2 = controlable.transform.root.position - controlable.transform.position; float distance = Vector3.Distance(position1, position2); return(distance < _distanceSnapMinimum); }
bool IsNeeded(AControlable controlable) { foreach (AControlable houseControlable in _maisons[_currentHouse]._controlables) { if (!houseControlable.ReactionableValidated()) { foreach (AReactionable reactionable in houseControlable.reactionables) { if (reactionable.objectActionable == controlable.objectType) { return(true); } } } } return(false); }
IEnumerator SnapObjectCoroutine(AControlable controlable, AControlable refControlable) { Vector3 originPosition = controlable.transform.localPosition; Vector3 refPosition = refControlable.transform.localPosition; Quaternion originRotation = controlable.transform.localRotation; Quaternion refRotation = refControlable.transform.localRotation; float time = 1f; Renderer renderer = GetComponent <Renderer>(); while (time > 0f) { time -= Time.deltaTime; controlable.transform.localRotation = Quaternion.Lerp(refRotation, originRotation, time); controlable.transform.localPosition = Vector3.Lerp(refPosition, originPosition, time); yield return(null); } yield return(null); }
public bool IsValidated(AControlable refControlable, AControlable controlable) { return(refControlable.IsValidated(controlable)); }
public bool CheckValidated(AControlable controlable) { return(IsValidated(GetObject(controlable.objectType), controlable)); }
public bool IsSameState(AControlable refControlable, AControlable controlable) { return(refControlable.IsSameState(controlable)); }
public bool CheckObjectState(AControlable controlable) { return(IsSameState(GetObject(controlable.objectType), controlable)); }
public virtual bool IsValidated(AControlable controlable) { return(ReactionableValidated() == controlable.ReactionableValidated()); }
private void Update() { switch (_state) { case PlayerState.ControllingPlayer: { if (Input.GetMouseButtonDown(0)) { RaycastHit hit; if (Physics.Raycast(_camera.transform.position, _camera.transform.forward, out hit, Mathf.Infinity)) { AControlable controlable = hit.collider.gameObject.GetComponentInParent <AControlable>(); if (controlable != null) { if (!controlable.isLocked) { Debug.Log("Object Selected: " + controlable); _controlledObject = controlable; Vector3 positionControlledObject = _controlledObject.transform.position; CharacterController controller = GetComponent <CharacterController>(); positionControlledObject.y = transform.position.y; controller.enabled = false; transform.position = positionControlledObject; controller.enabled = true; _controlledObjectParent = _controlledObject.transform.parent; _controlledObject.transform.SetParent(transform); _controlledObject.transform.forward = transform.forward; _camera.GetComponent <CameraOcclusionProtector>().distanceToTarget = 8f; _state = PlayerState.ControllingObject; _controlledObject.SetWalking(true); SoundManager.PlaySound("control_1", _controlledObject.transform.position); } else { SoundManager.PlaySound(Random.value > 0.5 ? "lock_1" : "lock_2", hit.point); } } } } break; } case PlayerState.ControllingObject: { if (Input.GetMouseButtonDown(1)) { _controlledObject.TryDoAction(); OnDoAction.Invoke(_controlledObject); } else if (Input.GetMouseButtonDown(0)) { Vector3 positionCamera = _camera.transform.position; Vector3 controledPosition = _controlledObject.transform.position; positionCamera.y = transform.position.y; gameObject.GetComponent <CharacterController>().Move(positionCamera - transform.position); // transform.position = positionCamera; _controlledObject.transform.SetParent(_controlledObjectParent); _controlledObject.transform.position = controledPosition; _camera.GetComponent <CameraOcclusionProtector>().distanceToTarget = 0f; _controlledObject.SetWalking(false); OnObjectReleased.Invoke(_controlledObject); _state = PlayerState.ControllingPlayer; SoundManager.PlaySound("release_1", _controlledObject.transform.position); _controlledObject = null; } break; } } playerStateAccessor = _state; }