/// <summary> /// OnTriggerExit is called when the Collider other has stopped touching the trigger. /// </summary> /// <param name="other">The other Collider involved in this collision.</param> void OnTriggerExit(Collider other) { var tmp = other.GetComponent <TriggerTeleport>(); if (tmp != null && tmp == teleport) { teleport = null; } }
/// <summary> /// OnTriggerEnter is called when the Collider other enters the trigger. /// </summary> /// <param name="other">The other Collider involved in this collision.</param> void OnTriggerEnter(Collider other) { var tmp = other.GetComponent <TriggerTeleport>(); if (tmp != null) { teleport = tmp; teleport.curCollider = other as BoxCollider; } }
static void RenderBoxGizmo(TriggerTeleport teleport, GizmoType gizmoType) { if (!EditorApplication.isPlaying) { } var color = s_HandleColor; if (!teleport.enabled) { color = s_HandleColorDisabled; } if (teleport.trigger == null) { teleport.trigger = teleport.GetComponent <BoxCollider>(); } var oldColor = Gizmos.color; var oldMatrix = Gizmos.matrix; Gizmos.matrix = UnScaledLocalToWorldMatrix(teleport.transform); Gizmos.color = color; DrawTeleport(teleport); }
static void DrawTeleport(TriggerTeleport teleport) { Handles.DrawLine(teleport.transform.localToWorldMatrix.MultiplyPoint(teleport.trigger.center), teleport.transform.localToWorldMatrix.MultiplyPoint(teleport.destPos)); }
public static GameObject Instantiate(ENTITY e) { GameObject entityObject; switch (e.Classname) { case "action_animate": { entityObject = AnimateAction.Instantiate(e); break; } case "action_move": { entityObject = MoveAction.Instantiate(e); break; } case "action_rotate": { entityObject = RotateAction.Instantiate(e); break; } case "action_sequence": { entityObject = ActionSequence.Instantiate(e); break; } case "action_sound": { entityObject = SoundAction.Instantiate(e); break; } case "action_wait": { entityObject = WaitAction.Instantiate(e); break; } case "audio_source": { entityObject = AudioSourceObject.Instantiate(e); break; } case "dream_environment": { entityObject = DreamEnvironment.Instantiate(e); break; } case "!map": { entityObject = MapObject.Instantiate(e); break; } case "!model": { entityObject = ModelObject.Instantiate(e); break; } case "music_controller": { entityObject = MusicController.Instantiate(e); break; } case "player_spawn": { entityObject = PlayerSpawn.Instantiate(e); break; } case "target": { entityObject = Target.Instantiate(e); break; } case "trigger_link": { entityObject = TriggerLink.Instantiate(e); break; } case "trigger_sequence": { entityObject = TriggerSequence.Instantiate(e); break; } case "trigger_sound": { entityObject = TriggerSound.Instantiate(e); break; } case "trigger_teleport": { entityObject = TriggerTeleport.Instantiate(e); break; } default: { Debug.LogWarning("Could not instantiate entity with classname " + e.Classname); entityObject = new GameObject(e.Classname); break; } } return(entityObject); }
// Update is called once per frame void Update() { if (Input.GetKey(KeyCode.LeftArrow)) //左 { agent.Move(Vector3.left * speed.z); } else if (Input.GetKey(KeyCode.UpArrow)) { agent.Move(Vector3.back * speed.z); } else if (Input.GetKey(KeyCode.DownArrow)) { agent.Move(Vector3.forward * speed.z); } else if (Input.GetKey(KeyCode.RightArrow)) //下 { agent.Move(Vector3.right * speed.z); } else if (Input.GetKey(KeyCode.C)) { } Vector3?dest = null; //传送过程中不能操作 if ((moveState & MoveState.Teleport) == MoveState.NONE) { if (Input.GetKey(KeyCode.D)) //右 { moveDir = -1; //右边 interTrans.eulerAngles = new Vector3(0, 270, 0); int idx = -1; if ((idx = CheckTrigger(false, TeleportType.DownRight)) >= 0) //传送到其他地方 { moveState |= MoveState.Teleport; moveState &= ~MoveState.Normal; agent.updatePosition = false; lastTrigger = teleports[idx]; teleportStartPos = transform.position; teleportDest = lastTrigger.worldDestPos; teleportDest.x += modelSize.x / 2 * moveDir; totalTeleportTime = Mathf.Sqrt(Mathf.Abs(teleportDest.y - transform.position.y) * 2 / gravity); //总时间 curTeleportTime = 0f; teleportVel = new Vector3(moveDir * agent.speed, 0f, 0f); // (teleportDest - teleportStartPos + 0.5f * new Vector3(0f, gravity, 0f) * teleportTime * teleportTime) / teleportTime; } else { moveState |= MoveState.Normal; dest = agent.transform.position + Vector3.left * speed.z; // } } else if (Input.GetKey(KeyCode.W)) { moveState |= MoveState.Normal; dest = agent.transform.position + Vector3.back * speed.z; } else if (Input.GetKey(KeyCode.S)) { moveState |= MoveState.Normal; dest = agent.transform.position + Vector3.forward * speed.z; } else if (Input.GetKey(KeyCode.A)) //左 { interTrans.eulerAngles = new Vector3(0, 90, 0); moveDir = 1; int idx = -1; if ((idx = CheckTrigger(false, TeleportType.DownLeft)) >= 0) //传送到其他地方 { moveState |= MoveState.Teleport; moveState &= ~MoveState.Normal; agent.updatePosition = false; lastTrigger = teleports[idx]; teleportStartPos = transform.position; teleportDest = lastTrigger.worldDestPos; teleportDest.x += modelSize.x / 2 * moveDir; totalTeleportTime = Mathf.Sqrt(Mathf.Abs(teleportDest.y - transform.position.y) * 2 / gravity); //总时间 curTeleportTime = 0f; teleportVel = new Vector3(moveDir * agent.speed, 0f, 0f); } else { moveState |= MoveState.Normal; dest = agent.transform.position + Vector3.right * speed.z; } } else //没有一般移动 { moveState &= ~MoveState.Normal; } //可以同时按下方向键和空格键 if (Input.GetKey(KeyCode.Space)) //跳跃 { if (jumpTime == 0f) { jumpTime = 0f; } moveState |= MoveState.Jump; int idx = -1; if ((idx = CheckTrigger(false, moveDir == -1 ? TeleportType.JumpRight : TeleportType.JumpLeft)) >= 0) //传送到其他地方 { moveState |= MoveState.Teleport; moveState &= ~MoveState.Normal; agent.updatePosition = false; lastTrigger = teleports[idx]; teleportStartPos = transform.position; teleportDest = lastTrigger.worldDestPos; float y = 0f; if (lastTrigger.type == TeleportType.UpLeft || lastTrigger.type == TeleportType.UpRight) //向上跳需要更大的加速度 { y = teleportDest.y - transform.position.y; // + 1f; teleportVel = new Vector3(agent.speed * moveDir, gravity * Mathf.Sqrt(2 * y / gravity), 0f); totalTeleportTime = Mathf.Sqrt(2 * y / gravity); // + Mathf.Sqrt(2/gravity); } else { teleportVel = new Vector3(agent.speed * moveDir, jumpVel, 0f); y = transform.position.y - teleportDest.y; totalTeleportTime = jumpVel / gravity + Mathf.Sqrt(2 * (0.5f * jumpVel * jumpVel / gravity + transform.position.y - teleportDest.y) / gravity); } curTeleportTime = 0f; } } } if ((moveState & MoveState.Teleport) != MoveState.NONE) //传送状态 { if (curTeleportTime < totalTeleportTime) { curTeleportTime += Time.deltaTime; transform.position = CalcTeleportPos(curTeleportTime); interTrans.localPosition = Vector3.zero; } else { var tmp = transform.position; tmp.y = teleportDest.y; agent.Warp(tmp); agent.updatePosition = true; moveState &= ~MoveState.Teleport; moveState &= ~MoveState.Jump; totalTeleportTime = 0f; curTeleportTime = -1f; lastTrigger = null; animContrller.SetInteger("aniState", (int)PlayerAnimationNames.IDLE1); } } else { if ((moveState & MoveState.Normal) != MoveState.NONE) //一般的移动 { if (dest != null) { agent.SetDestination(dest.Value); } } else { agent.Warp(transform.position); //停到当前的位置 } if ((moveState & MoveState.Jump) != MoveState.NONE) //跳跃状态 { var y = jumpVel * jumpTime - 0.5f * gravity * jumpTime * jumpTime; jumpTime += Time.deltaTime; if (jumpTime > 0.1f && y < 0f) { moveState &= ~MoveState.Jump; y = 0f; jumpTime = 0f; } interTrans.localPosition = new Vector3(0, y, 0); } } //动作的处理部分 if ((moveState & MoveState.Jump) != MoveState.NONE) { animContrller.SetInteger("aniState", (int)PlayerAnimationNames.JUMP); } else if ((moveState & MoveState.Normal) != MoveState.NONE) { animContrller.SetInteger("aniState", (int)PlayerAnimationNames.RUN); } else { animContrller.SetInteger("aniState", (int)PlayerAnimationNames.IDLE1); } if (Input.mouseScrollDelta.y != 0f) { scrollDelta += Input.mouseScrollDelta.y; z += Input.mouseScrollDelta.y; z = Mathf.Max(z, minZ); z = Mathf.Min(z, maxZ); } var temp = character.position; temp.z = z; cam.transform.position = temp; }