/// <summary> /// ワープする位置をマッピングします。 /// WarpGate(from) 内の点 warpPosition を、WarpGate(to) 内の点にマッピングします。 /// </summary> /// <param name="from"> /// ワープするときに侵入した WarpGate 。 /// </param> /// <param name="to"> /// ワープする先になる WarpGate 。 /// </param> /// <param name="warpPosition"> /// マッピングする座標。 /// </param> /// <returns> /// マッピングされた座標。 /// </returns> public static Vector3 MapWarpPosition(WarpGate from, WarpGate to, Vector3 warpPosition) { // NOTE: // いったんスケールは同等のものとして扱う。 Vector3 fromCenterOriginPosition = warpPosition - from.transform.position; fromCenterOriginPosition = (Quaternion.Inverse(from.transform.rotation) * to.transform.rotation) * fromCenterOriginPosition; return(to.transform.position + fromCenterOriginPosition); }
/// <summary> /// ワープに関する状態を更新します。 /// </summary> public void UpdateWarpStatus() { // NOTE: // 一度でもゲートの外に出たら、同じゲートからワープできるようにします。 if (this.isReadyToWarp) { return; } if (!this.lastWarpGate.bounds.Contains(base.bounds)) { this.lastWarpGate = null; this.isReadyToWarp = true; } ; }
/// <summary> /// 指定したゲートを使ってワープします。 /// </summary> /// <param name="warpGate"> /// ワープに使うゲート。 /// </param> /// <returns> /// ワープに成功するとき true, 失敗するとき false 。 /// </returns> public bool Warp(WarpGate warpGate) { if (!IsAbleToWarp(warpGate)) { return(false); } base.transform.position = WarpGate.MapWarpPosition(warpGate, warpGate.target, base.transform.position); base.transform.rotation *= (Quaternion.Inverse(warpGate.transform.rotation) * warpGate.target.transform.rotation); this.lastWarpGate = warpGate.target; this.isReadyToWarp = false; WarpEventInfo eventInfo = new WarpEventInfo(this, warpGate); this.warpEvent.Invoke(eventInfo); warpGate.warpEvent.Invoke(eventInfo); return(true); }
/// <summary> /// 新しいインスタンスを初期化します。 /// </summary> /// <param name="warpObject"> /// ワープしたオブジェクト。 /// </param> /// <param name="warpGate"> /// ワープさせたゲート。 /// </param> public WarpEventInfo(WarpObject warpObject, WarpGate warpGate) { this.warpObject = warpObject; this.warpGate = warpGate; }
/// <summary> /// 指定したゲートを使ってワープできるかどうかを検証します。 /// </summary> /// <param name="warpGate"> /// 検証するゲート。 /// </param> /// <returns> /// ワープできるとき true, できないとき false 。 /// </returns> public bool IsAbleToWarp(WarpGate warpGate) { return(warpGate.bounds.Contains(base.bounds) && this.isReadyToWarp); }