Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <summary>
        /// ワープに関する状態を更新します。
        /// </summary>
        public void UpdateWarpStatus()
        {
            // NOTE:
            // 一度でもゲートの外に出たら、同じゲートからワープできるようにします。

            if (this.isReadyToWarp)
            {
                return;
            }

            if (!this.lastWarpGate.bounds.Contains(base.bounds))
            {
                this.lastWarpGate  = null;
                this.isReadyToWarp = true;
            }
            ;
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
 /// <summary>
 /// 新しいインスタンスを初期化します。
 /// </summary>
 /// <param name="warpObject">
 /// ワープしたオブジェクト。
 /// </param>
 /// <param name="warpGate">
 /// ワープさせたゲート。
 /// </param>
 public WarpEventInfo(WarpObject warpObject, WarpGate warpGate)
 {
     this.warpObject = warpObject;
     this.warpGate   = warpGate;
 }
Exemplo n.º 5
0
 /// <summary>
 /// 指定したゲートを使ってワープできるかどうかを検証します。
 /// </summary>
 /// <param name="warpGate">
 /// 検証するゲート。
 /// </param>
 /// <returns>
 /// ワープできるとき true, できないとき false 。
 /// </returns>
 public bool IsAbleToWarp(WarpGate warpGate)
 {
     return(warpGate.bounds.Contains(base.bounds) && this.isReadyToWarp);
 }