private void HandleGetBombProcess(PushableObject pushable) { ChangeState(Action.ForcedMove); forcedMoveObject = pushable; forcedMoveObject.SetPositionLock(true); // 在此过程中被移动的物体锁定 Vector3 bombPosition = pushable.transform.position; // 人物旋转到可以拿起炸弹的方向 Vector3 bombDir = bombPosition - transform.position; bombDir.y = 0f; bombDir.Normalize(); forcedStartRotation = transform.rotation; forcedEndRotation = Quaternion.LookRotation(bombDir, Vector3.up); // 计算旋转之后的搬运点位置 float carryPointDist = (pushController.bombCarryPoint.position - transform.position).magnitude; Vector3 rotatedCarryPoint = bombDir * carryPointDist + transform.position; Vector3 dist = bombPosition - rotatedCarryPoint; dist.y = 0f; forcedMoveDir = dist.normalized; float rotateTime = 1.0f / playerRotationSpeed; float moveTime = dist.magnitude / playerForcedMovingSpeed; totolTime = rotateTime > moveTime ? rotateTime : moveTime; forcedMoveTimer = 0f; }
void OnTriggerEnter2D(Collider2D other) { PushableObject pushableObject = GameObject .Find("PushableObject") .GetComponent <PushableObject>(); pushableObject.ResetPuzzle(); }
// Bloco de funcoes referente a acao de empurrar objetos public void GrabObject(GameObject heldObject) { FMODUnity.RuntimeManager.PlayOneShot(voiceAylaShortActions, transform.position); currentObject = heldObject; currPushableObjectScript = currentObject.GetComponent <PushableObject>(); currPushableObjectScript.Grab(grabPosition); }
void AttachPushable(PushableObject pushable) { pushable.transform.parent = transform; attachedPushable = pushable; attachedPushable.GetPlatformTrigger()?.Decrement(); SetSpeed(moveSpeedWhenPushing); base.SpecialAction(); }
private void OnTriggerExit(Collider other) { if (other.CompareTag("Bomb") || other.CompareTag("Player")) { PushableObject pushable = other.gameObject.GetComponent <PushableObject>(); pushableInRange.Remove(pushable); } }
private IEnumerator RunBridge(PushableObject p_objectToMove) { p_objectToMove.m_isOnBridge = true; p_objectToMove.gameObject.layer = m_transparentLayer; float t1 = 0; while (t1 < m_bridgeMoveTime) { t1 += Time.fixedDeltaTime; float progress = t1 / m_bridgeMoveTime; Vector3 targetPosition = Vector3.Lerp(transform.position, m_otherBridge.transform.position, progress); p_objectToMove.PhysicsSeekTo(targetPosition); yield return(new WaitForFixedUpdate()); } float t2 = 0; Vector3 endTargetPos = m_otherBridge.transform.position + (Vector3.up * p_objectToMove.transform.localScale.y); while (t2 < m_endMoveTime) { t2 += Time.fixedDeltaTime; float progress = t2 / m_endMoveTime; Vector3 targetPosition = Vector3.Lerp(m_otherBridge.transform.position, endTargetPos, progress); p_objectToMove.PhysicsSeekTo(targetPosition); yield return(new WaitForFixedUpdate()); } //p_objectToMove.m_velocity = Vector3.right * 30; PushGun pushGun = p_objectToMove.gameObject.GetComponent <PushGun>(); if (pushGun == null) { p_objectToMove.gameObject.layer = m_moveableLayer; } else { p_objectToMove.gameObject.layer = 13; } //p_objectToMove.m_isOnBridge = false; }
private void OnTriggerStay(Collider other) { PushableObject po = other.gameObject.GetComponent <PushableObject>(); if (po != null && other.attachedRigidbody.velocity == Vector3.zero) { anim1.enabled = true; anim2.enabled = true; po.canBePushed = false; } }
void DetachPushable() { if (attachedPushable == null) { return; } attachedPushable.transform.parent = attachedPushable.GetInitialParent; attachedPushable.GetPlatformTrigger()?.Decrement(); attachedPushable = null; SetSpeed(initialmovementSpeed); }
protected override bool ExtendedPushConditionsValid(GameObject inGameObject) { var actionStateMachine = PushableObject.GetComponent <IActionStateMachineInterface>(); if (actionStateMachine != null) { return(actionStateMachine.IsActionStateActiveOnTrack(EActionStateMachineTrack.Locomotion, EActionStateId.Dead)); } return(false); }
private void MoveObjects(LayerMask p_mask) { if (!m_pushLocked) { Collider[] colliders = Physics.OverlapSphere(transform.position, 1f, p_mask); if (colliders.Length > 0) { PushableObject pushable = colliders[0].gameObject.GetComponent <PushableObject>(); pushable.PushObject(m_velocity); } } }
private void OnTriggerExit(Collider other) { PushableObject pushableObject = other.gameObject.GetComponent <PushableObject>(); if (pushableObject != null) { pushableObject.SetPlatformTrigger(null); NumPushingObjects--; } if (other.gameObject.GetComponent <CharachterModel>()) { NumPushingObjects--; } }
private void OnTriggerEnter(Collider other) { if (CheckCollisionLayer(m_bridgeMoveableObjects, other.gameObject)) { PushableObject pushTarget = other.gameObject.GetComponent <PushableObject>(); if (!m_isBeingCarried) { if (!pushTarget.m_isOnBridge) { StartCoroutine(RunBridge(pushTarget)); } } } }
private void OnTriggerEnter(Collider other) { Debug.Log(other.name); PushableObject pushableObject = other.gameObject.GetComponent <PushableObject>(); if (pushableObject != null) { pushableObject.SetPlatformTrigger(this); NumPushingObjects++; } if (other.gameObject.GetComponent <CharachterModel>()) { NumPushingObjects++; } }
void StartPushingEnd() { PushableObjectPad pad = pushableObject.GetComponent <PushableObjectPad>(); PushableObject pushable = pushableObject.transform.parent.GetComponent <PushableObject>(); pushingSpeed = pushingSpeed * pushable.speedMult; Vector3 endPos = rb.position + pad.endPosOffset; float inverseMoveTime = pushingSpeed / pad.endPosOffset.magnitude; pushable.Push(pad.endPosOffset, inverseMoveTime); StartCoroutine(SmoothMovement((bool done) => { anim.SetTrigger("stopPushing"); GameSound.Stop("Push"); }, endPos, inverseMoveTime)); GameSound.Play("Push"); }
public void VerticalAttack() { UpdateRaycastOrigins(); // float originalMoveAmountX = moveAmount.x; Collider2D otherCollider = null; HashSet <Collider2D> attackedEnemies = new HashSet <Collider2D>(); float directionY = Mathf.Sign(attack.direction.y); for (int i = 0; i < verticalRayCount; i++) { Vector2 rayOrigin = (directionY == -1) ? raycastOrigins.bottomLeft : raycastOrigins.topLeft; rayOrigin += Vector2.right * (verticalRaySpacing * i); RaycastHit2D hit = Physics2D.Raycast(rayOrigin, Vector2.up * directionY, range, collisionMask); Debug.DrawRay(rayOrigin, Vector2.up * directionY * range, Color.yellow); if (hit) { if (hit.distance == 0) { continue; } otherCollider = hit.collider; } if (otherCollider != null && otherCollider.gameObject != this.gameObject && !attackedEnemies.Contains(otherCollider)) // && otherCollider.tag == "Pushable" { attackedEnemies.Add(otherCollider); Destructable destructable = otherCollider.gameObject.GetComponent <Destructable>(); if (destructable) { destructable.Damage(damage); } if (otherCollider.tag == "Pushable") { PushableObject pushable = otherCollider.gameObject.GetComponent <PushableObject>(); pushable.Launch(new Vector2(pushForce.x, pushForce.y * directionY)); } } } }
private void Start() { _connector = SelectableObject.GetAsChild(gameObject, ESwitchableObjectId.ELEVATOR_CALLER_CONNECTOR); _panel = SelectableObject.GetAsChild(_connector.gameObject, ESwitchableObjectId.ELEVATOR_CALLER_PANEL); _commonWires = SelectableObject.GetAsChild(_connector.gameObject, ESwitchableObjectId.ELEVATOR_CALLER_WIRES); _button = SelectableObject.GetAsChild <PushableObject>(_panel.gameObject, "button"); _connectorWires = _connector.transform.Find("connector_static_wires").gameObject; _connector.Clicked += OnConnectorClicked; _connector.Closed += OnConnectorClosed; _panel.Clicked += OnPanelClicked; _panel.Closed += OnPanelClosed; _panel.OpenAnimationCompleted += OnPanelOpenAnimationCompleted; _commonWires.Opened += OnWiresConnectedWithTape; _button.Opened += OnButtonClicked; }
void OnControllerColliderHit(ControllerColliderHit hit) { if (!bearTriesToPush) { return; } if (attachedPushable != null) { return; } PushableObject pushableObject = hit.gameObject.GetComponent <PushableObject>(); if (pushableObject != null) { AttachPushable(pushableObject); } }
/// <summary> /// 开始推动物体或结束推动物体 /// 如果已经有正在推动的物体,则会放下它,否则会接近最近的一个可被推动的物体尝试开始推动 /// </summary> public void ChangePushState() { if (CheckAnimatorState("Push Idle", "Push Run") && pushController.GetCarriedType() == CarryType.Player) // 只有推动的是冰冻的队友时才能放下 { // 放下正在推动的物体 StopPushing(); } if (CheckAnimatorState("Idle", "Run")) { PushableObject pushable = pushController.GetPushableInRange(); if (pushable != null) { HandleGetBombProcess(pushable); } } }
public void Kick(float bombShootSpeed, float rotateTime, float kickDelay, Vector3 forwardDir) { if (carriedObject != null && !waitForCarrying) { if (carriedObject.type != PushableObject.CarryType.Bomb) { return; } Bomb bomb = carriedObject.GetComponent <Bomb>(); if (bomb != null) { StartCoroutine(RotateToTarget(bomb, forwardDir, rotateTime)); PhotonView bombView = PhotonView.Get(bomb); bomb.DelayShoot(forwardDir * bombShootSpeed, kickDelay); bomb.Detach(); bombView.RPC("DelayShoot", RpcTarget.Others, forwardDir * bombShootSpeed, kickDelay); bombView.RPC("Detach", RpcTarget.Others); carriedObject = null; } } }
public void Push() { Vector3 pushD = playerT.rotation.eulerAngles; float handPosition = this.GetComponent <CapsuleCollider>().radius; Vector3 hitBox = new Vector3(0.2f, 0.2f, 0.2f); Collider[] pushableObjects; if (facing == Direction.Up) { pushableObjects = Physics.OverlapBox( new Vector3(playerT.position.x + handPosition, playerT.position.y, playerT.position.z), hitBox); } else if (facing == Direction.Down) { pushableObjects = Physics.OverlapBox( new Vector3(playerT.position.x - handPosition, playerT.position.y, playerT.position.z), hitBox); } else if (facing == Direction.Left) { pushableObjects = Physics.OverlapBox( new Vector3(playerT.position.x, playerT.position.y, playerT.position.z + handPosition), hitBox); } else { pushableObjects = Physics.OverlapBox( new Vector3(playerT.position.x, playerT.position.y, playerT.position.z - handPosition), hitBox); } foreach (Collider c in pushableObjects) { Debug.Log(c.gameObject.name); PushableObject pB = c.gameObject.GetComponent <PushableObject>(); if (pB != null && !pB.beingPushed) { pB.BePushed(facing); } } }
private void FixedUpdate() { // 处理强制移动(走向被推动的物体) if (curState == Action.ForcedMove) { if (forcedMoveObject == null) { ResetStateIfNotConstrained(); forcedMoveTimer = 0f; } else { if (forcedMoveTimer < totolTime) { playerRigidbody.velocity = forcedMoveDir * playerForcedMovingSpeed; playerRigidbody.MoveRotation(Quaternion.Slerp(forcedStartRotation, forcedEndRotation, forcedMoveTimer * playerRotationSpeed)); forcedMoveTimer += Time.fixedDeltaTime; } else { forcedMoveTimer = 0f; playerRigidbody.velocity = Vector3.zero; if (forcedMoveObject != null) { forcedMoveObject.SetPositionLock(false); // 解除锁定 pushController.AttachPushable(forcedMoveObject); ChangeState(Action.Pushing); forcedMoveObject = null; } else { ResetStateIfNotConstrained(); } } } } }
// Update is called once per frame void Update() { //PushableObject pushScript; LiftableObject liftScript = null; EnvironmentalPushable envPushable = null; pushBoxController = null; if (characterControl != null && characterControl.lockMovement == true) { dropObject(); } //Raycasting (4 directions) ---------------------------- RaycastHit rayHit; if (Physics.Raycast(transform.position + new Vector3(0, 1, 0), transform.forward + new Vector3(0, -0.5f, 0), out rayHit, 1.2f, rayMask)) { pushBoxController = rayHit.collider.gameObject.GetComponent <PushableObject>(); liftScript = rayHit.collider.gameObject.GetComponent <LiftableObject>(); envPushable = rayHit.collider.gameObject.GetComponent <EnvironmentalPushable>(); } if ((pushBoxController == null && liftScript == null && envPushable == null) && Physics.Raycast(transform.position + new Vector3(0, 1, 0) + 0.25f * transform.right, transform.forward + new Vector3(0, -0.5f, 0) + 1.5f * transform.right, out rayHit, 1.2f, rayMask)) { pushBoxController = rayHit.collider.gameObject.GetComponent <PushableObject>(); liftScript = rayHit.collider.gameObject.GetComponent <LiftableObject>(); envPushable = rayHit.collider.gameObject.GetComponent <EnvironmentalPushable>(); } if ((pushBoxController == null && liftScript == null && envPushable == null) && Physics.Raycast(transform.position + new Vector3(0, 1, 0) - 0.25f * transform.right, transform.forward + new Vector3(0, -0.5f, 0) - 1.5f * transform.right, out rayHit, 1.2f, rayMask)) { pushBoxController = rayHit.collider.gameObject.GetComponent <PushableObject>(); liftScript = rayHit.collider.gameObject.GetComponent <LiftableObject>(); envPushable = rayHit.collider.gameObject.GetComponent <EnvironmentalPushable>(); } if (optionalCam != null) { if ((pushBoxController == null && liftScript == null && envPushable == null) && Physics.Raycast(optionalCam.transform.position, optionalCam.transform.forward, out rayHit, (Vector3.Distance(transform.position, optionalCam.transform.position) + 1.3f), rayMask)) { pushBoxController = rayHit.collider.gameObject.GetComponent <PushableObject>(); liftScript = rayHit.collider.gameObject.GetComponent <LiftableObject>(); envPushable = rayHit.collider.gameObject.GetComponent <EnvironmentalPushable>(); } } Debug.DrawRay(transform.position + new Vector3(0, 1, 0) + 0.25f * transform.right, (transform.forward + new Vector3(0, -0.5f, 0) + 1.5f * transform.right).normalized * 1.2f, Color.magenta); Debug.DrawRay(transform.position + new Vector3(0, 1, 0) - 0.25f * transform.right, (transform.forward + new Vector3(0, -0.5f, 0) - 1.5f * transform.right).normalized * 1.2f, Color.magenta); if (optionalCam != null) { Debug.DrawRay(optionalCam.transform.position, (optionalCam.transform.forward).normalized * (Vector3.Distance(transform.position, optionalCam.transform.position) + 1.2f), Color.green); } Debug.DrawRay(transform.position + new Vector3(0, 1, 0), (transform.forward + new Vector3(0, -0.5f, 0)).normalized * 1.2f, Color.magenta); //------------------------------------------------------- //Raycast resolution ---------------------- if (liftScript != null && characterControl.lockMovement != true) { objectToLift = liftScript.gameObject; nextToPickup = true; } else { if (!holdingPickup) { objectToLift = null; } nextToPickup = false; if (pushBoxController != null) { objectToPush = pushBoxController.gameObject; nextToPushable = true; } else { if (!pushingObject) { objectToPush = null; } nextToPushable = false; if (envPushable != null) { nextToEnvPushable = true; } else { nextToEnvPushable = false; } } } //----------------------------------------- if (objectToLift != null) { if (nextToPickup && !holdingPickup && !pushingObject && !objectToLift.GetComponent <LiftableObject>().beingCarried) { prompt.SetActive(true); if (Input.GetKeyDown(KeyCode.E) || Input.GetButtonDown("Interact")) { //lerpingPickup = true; objectToLift.GetComponent <LiftableObject>().beingCarried = true; LiftObject(); } } } if (nextToPushable && !holdingPickup && !pushingObject) { prompt.SetActive(true); if (Input.GetKeyDown(KeyCode.E) || Input.GetButtonDown("Interact")) { transitioning = true; pushingObject = true; characterControl.lockMovement = true; characterControl.pushing = true; //character.pushingObject = true; objectToPush.GetComponent <Rigidbody>().mass = 200f; //gameObject.GetComponent<MoveBehaviour>().pushing = true; //objectToPush.GetComponent<Rigidbody>().isKinematic = true; //Physics.IgnoreCollision(objectToPush.GetComponent<Collider>(), gameObject.transform.parent.GetComponent<Collider>()); //pushPos.position = objectToPush.transform.position; pushBoxController.beingPushed = true; float tempDist = Vector3.Distance(transform.position, pushBoxController.pushPoints[0].position); int nearestPoint = 0; for (int i = 0; i < pushBoxController.pushPoints.Length; i++) { if (Vector3.Distance(transform.position, pushBoxController.pushPoints[i].position) < tempDist) { tempDist = Vector3.Distance(transform.position, pushBoxController.pushPoints[i].position); nearestPoint = i; } } pushPoint = pushBoxController.pushPoints[nearestPoint]; } } if (nextToEnvPushable && !holdingPickup && !pushingObject) { if (envPushable.animPlayed == false) { prompt.SetActive(true); if (Input.GetKeyDown(KeyCode.E) || Input.GetButtonDown("Interact")) { envPushable.PlayAnim(); prompt.SetActive(false); } } } if ((!nextToPickup && !nextToPushable && !nextToEnvPushable) || holdingPickup || pushingObject) { prompt.SetActive(false); } if (holdingPickup && !transitioning) { if (Input.GetKeyDown(KeyCode.E) || Input.GetButtonDown("Interact")) { //lerpingPickup = false; dropObject(); } } if (pushingObject && !transitioning) { //print(pushPos.position); if (Input.GetKeyDown(KeyCode.E) || Input.GetButtonDown("Interact")) { pushingObject = false; characterControl.pushing = false; characterControl.lockMovement = false; objectToPush.GetComponent <Rigidbody>().mass = 100000; //gameObject.GetComponent<MoveBehaviour>().pushing = false; //Physics.IgnoreCollision(objectToPush.GetComponent<Collider>(), gameObject.transform.parent.GetComponent<Collider>(), false); } else { if (Vector3.Distance(transform.position, new Vector3(pushPoint.position.x, transform.position.y, pushPoint.position.z)) > 0.03f && characterControl.lockMovement) { transform.position = Vector3.Lerp(transform.position, new Vector3(pushPoint.position.x, transform.position.y, pushPoint.position.z), 0.5f); Physics.IgnoreCollision(objectToPush.GetComponent <Collider>(), gameObject.transform.GetComponent <Collider>()); //play moving anim here } else { Physics.IgnoreCollision(objectToPush.GetComponent <Collider>(), gameObject.transform.GetComponent <Collider>(), false); if (characterControl.lockMovement) { characterControl.lockMovement = false; transform.LookAt(new Vector3(objectToPush.transform.position.x, transform.position.y, objectToPush.transform.position.z)); } else { transform.LookAt(new Vector3(objectToPush.transform.position.x, transform.position.y, objectToPush.transform.position.z)); if (Vector3.Distance(pushPos.position, new Vector3(pushPoint.position.x, pushPos.position.y, pushPoint.position.z)) > 1.5f) { pushingObject = false; characterControl.pushing = false; characterControl.lockMovement = false; objectToPush.GetComponent <Rigidbody>().mass = 100000; } } } } } if (holdingPickup && lerpingPickup) { objectToLift.transform.LookAt(liftPos.position + transform.forward); objectToLift.transform.position = Vector3.Lerp(objectToLift.transform.position, liftPos.position, liftSpeed); } /*if (pushingObject) * { * //objectToPush.transform.position = Vector3.Lerp(objectToPush.transform.position, pushPos.position, 5); * }*/ transitioning = false; }
private void Awake() { movementController = gameObject.GetComponent <PushableObject>(); }
/// <summary> /// 主动解除现在正在推的物体 /// </summary> public void DetachCurrentPushing() { carriedObject = null; }
/// <summary> /// 让PushController获得推动的物体 /// </summary> public void AttachPushable(PushableObject pushable) { carriedObject = pushable; pushable.Attach(playerController); }
/* ====================================== * * UPDATE * * ====================================== */ void Update() { //grounded = Physics2D.Linecast (transform.position, groundCheck.position, ground); //ContactFilter2D filter; //filter RaycastHit2D[] hitObjects = new RaycastHit2D[20]; grounded = (groundCollider.Cast(Vector2.zero, hitObjects) > 0) ? true : false; direction = new Vector3(0, 0, 0); if ((Input.GetKeyDown(moveRightKey) || Input.GetKeyDown(moveRightAlternativeKey)) && !isPreparingToJump) { facingRight = true; } if ((Input.GetKeyDown(moveLeftKey) || Input.GetKeyDown(moveLeftAlternativeKey)) && !isPreparingToJump) { facingRight = false; } if ((Input.GetKey(moveRightKey) || Input.GetKey(moveRightAlternativeKey)) && !isPreparingToJump) { moving = true; } else if ((Input.GetKey(moveLeftKey) || Input.GetKey(moveLeftAlternativeKey)) && !isPreparingToJump) { moving = true; } else { moving = false; } anim.SetBool("isMoving", moving); anim.SetBool("isGrounded", grounded); anim.SetBool("isHanging", hanging); if ((airControl && !grounded) || grounded) { transform.localScale = (facingRight ? new Vector3(1, 1, 1) : new Vector3(-1, 1, 1)); direction += (moving ? new Vector3(transform.localScale.x, 0, 0) : Vector3.zero); } // =============== PUSH DEBUG =================== Debug.DrawLine(transform.position, transform.position + Vector3.right * 2f); // ============ ENDOF PUSH DEBUG ================ if (Input.GetKey(crouchKey) || Input.GetKey(crouchAlternativeKey)) { currentMoveSpeed = crouchSpeed; walkCollider.enabled = false; crouchCollider.enabled = true; } else if (Input.GetKeyDown(pushKey) || Input.GetKeyDown(pushAlternativeKey)) { RaycastHit2D hit = Physics2D.Raycast(transform.position, (facingRight) ? Vector3.right : Vector3.left, 2f, pushableLayers); if (hit != null) { PushableObject pushObject = hit.transform.gameObject.GetComponent <PushableObject>(); if (pushObject != null) { pushObject.Push(transform.position); anim.SetTrigger("push"); } } } else { currentMoveSpeed = moveSpeed; walkCollider.enabled = true; crouchCollider.enabled = false; if ((Input.GetKeyDown(jumpKey) || Input.GetKeyDown(jumpAlternativeKey)) && grounded) { isPreparingToJump = true; currentJumpForce = minJumpForce; currentTime = 0f; currentTicks = 0f; } bool forceJump = false; if ((Input.GetKey(jumpKey) || Input.GetKey(jumpAlternativeKey)) && isPreparingToJump) { currentTime += Time.deltaTime; if (currentTime >= (jumpPrepareTime / numberOfTicks)) { currentJumpForce += (maxJumpForce - minJumpForce) / numberOfTicks; currentTicks++; //Debug.Log("TICK-TACK"); currentTime = 0f; } if (currentTicks == numberOfTicks) { forceJump = true; } } if (((Input.GetKeyUp(jumpKey) || Input.GetKeyUp(jumpAlternativeKey)) && grounded && isPreparingToJump) || forceJump) { isPreparingToJump = false; isJumping = true; } } }
public void ReleaseObject() { currPushableObjectScript.Release(); currPushableObjectScript = null; }
// Start is called before the first frame update void Start() { objectScript = transform.parent.gameObject.GetComponent <PushableObject>(); }