Esempio n. 1
0
            // チームデータごと
            public void Execute(int teamId)
            {
                var tdata = teamData[teamId];

                if (tdata.IsActive() == false || tdata.boneIndex < 0)
                {
                    tdata.updateCount = 0;
                    tdata.runCount    = 0;
                    teamData[teamId]  = tdata;
                    return;
                }

                // ワールド移動影響
                WorldInfluence wdata = teamWorldInfluenceList[teamId];
                var            bpos  = bonePosList[tdata.boneIndex];
                var            brot  = boneRotList[tdata.boneIndex];

                // 移動量算出
                float3     movePos = bpos - wdata.oldPosition;
                quaternion moveRot = MathUtility.FromToRotation(wdata.oldRotation, brot);

                wdata.moveOffset     = movePos;
                wdata.rotationOffset = moveRot;

                // テレポート判定
                if (wdata.resetTeleport == 1)
                {
                    if (math.length(movePos) >= wdata.teleportDistance || math.degrees(MathUtility.Angle(moveRot)) >= wdata.teleportRotation)
                    {
                        tdata.SetFlag(Flag_Reset_WorldInfluence, true);
                        tdata.SetFlag(Flag_Reset_Position, true);
                    }
                }

                bool reset = false;

                if (tdata.IsFlag(Flag_Reset_WorldInfluence) || tdata.IsFlag(Flag_Reset_Position))
                {
                    // リセット
                    wdata.moveOffset     = 0;
                    wdata.rotationOffset = quaternion.identity;
                    wdata.oldPosition    = bpos;
                    wdata.oldRotation    = brot;

                    // チームタイムリセット(強制更新)
                    tdata.nowTime = updateDeltaTime;

                    reset = true;
                }
                wdata.nowPosition = bpos;
                wdata.nowRotation = brot;


                // 時間更新(タイムスケール対応)
                // チームごとに固有の時間で動作する
                tdata.updateCount = 0;
                tdata.runCount    = 0;
                float timeScale = tdata.timeScale * globalTimeScale;
                float addTime   = dtime * timeScale;

                tdata.time   += addTime;
                tdata.addTime = addTime;

                // 時間ステップ
                float nowTime = tdata.nowTime + addTime;

                while (nowTime >= updateDeltaTime)
                {
                    nowTime -= updateDeltaTime;
                    tdata.updateCount++;
                }

                // リセットフラグがONならば最低1回更新とする
                if (reset)
                {
                    tdata.updateCount = Mathf.Max(tdata.updateCount, 1);
                }

                // 最大実行回数
                //tdata.updateCount = math.min(tdata.updateCount, ups / 30);
                tdata.updateCount = math.min(tdata.updateCount, maxUpdateCount);

                tdata.nowTime = nowTime;

                // スタート時間(最初の物理更新が実行される時間)
                tdata.startTime = tdata.time - nowTime - updateDeltaTime * (tdata.updateCount - 1);

                // 補間再生判定
                if (timeScale < 0.99f || unityTimeScale < 0.99f)
                {
                    tdata.SetFlag(Flag_Interpolate, true);
                }
                else
                {
                    tdata.SetFlag(Flag_Interpolate, false);
                }

                // リセットフラグOFF
                tdata.SetFlag(Flag_Reset_WorldInfluence, false);

                // 風
                Wind(ref tdata, bpos);

                // 書き戻し
                teamData[teamId] = tdata;
                teamWorldInfluenceList[teamId] = wdata;
            }
Esempio n. 2
0
            // チームデータごと
            public void Execute(int teamId)
            {
                var tdata = teamData[teamId];

                // グローバルチーム判定
                bool isGlobal = teamId == 0;

                if (tdata.IsActive() == false || (isGlobal == false && tdata.boneIndex < 0))
                {
                    tdata.updateCount = 0;
                    tdata.runCount    = 0;
                    teamData[teamId]  = tdata;
                    return;
                }

                if (isGlobal)
                {
                    // グローバルチーム
                    // 時間更新(タイムスケール対応)
                    UpdateTime(ref tdata, false);
                }
                else
                {
                    // チームボーン情報
                    var bpos = bonePosList[tdata.boneIndex];
                    var brot = boneRotList[tdata.boneIndex];
                    var bscl = boneSclList[tdata.boneIndex];

                    // チームスケール倍率算出
                    if (tdata.initScale.x > 0.0f)
                    {
                        tdata.scaleRatio = math.length(bscl) / math.length(tdata.initScale);
                    }

                    // マイナススケール対応
                    tdata.scaleDirection = math.sign(bscl);
                    if (bscl.x < 0 || bscl.y < 0 || bscl.z < 0)
                    {
                        tdata.quaternionScale = new float4(-math.sign(bscl), 1);
                    }
                    else
                    {
                        tdata.quaternionScale = 1;
                    }

                    // ワールド移動影響
                    WorldInfluence wdata = teamWorldInfluenceList[teamId];

                    // 移動量算出
                    float3     moveVector = bpos - wdata.oldPosition;
                    quaternion moveRot    = MathUtility.FromToRotation(wdata.oldRotation, brot);

                    // 移動影響(無視する移動量+考慮する移動量)
                    var moveLen = math.length(moveVector);
                    if (moveLen > 1e-06f)
                    {
                        float speed = moveLen / dtime;

                        //const float maxspeed = 10.0f; // todo:最大速度テスト m/s
                        float ratio = math.max(speed - wdata.maxMoveSpeed, 0.0f) / speed;
                        wdata.moveIgnoreOffset = moveVector * ratio;
                        wdata.moveOffset       = moveVector - wdata.moveIgnoreOffset;
                    }
                    else
                    {
                        wdata.moveIgnoreOffset = 0;
                        wdata.moveOffset       = 0;
                    }

                    // 回転影響
                    wdata.rotationOffset = moveRot;

                    // 速度ウエイト更新
                    if (tdata.velocityWeight < 1.0f)
                    {
                        float addw = tdata.velocityRecoverySpeed > 1e-6f ? dtime / tdata.velocityRecoverySpeed : 1.0f;
                        tdata.velocityWeight = math.saturate(tdata.velocityWeight + addw);
                    }

                    // テレポート判定
                    if (wdata.resetTeleport == 1)
                    {
                        // テレポート距離はチームスケールを乗算する
                        if (moveLen >= wdata.teleportDistance * tdata.scaleRatio || math.degrees(MathUtility.Angle(moveRot)) >= wdata.teleportRotation)
                        {
                            tdata.SetFlag(Flag_Reset_WorldInfluence, true);
                            tdata.SetFlag(Flag_Reset_Position, true);
                        }
                    }

                    bool reset = false;
                    if (tdata.IsFlag(Flag_Reset_WorldInfluence) || tdata.IsFlag(Flag_Reset_Position))
                    {
                        // リセット
                        wdata.moveOffset       = 0;
                        wdata.moveIgnoreOffset = 0;
                        wdata.rotationOffset   = quaternion.identity;
                        wdata.oldPosition      = bpos;
                        wdata.oldRotation      = brot;

                        // チームタイムリセット(強制更新)
                        tdata.nowTime = updateDeltaTime;

                        // 速度ウエイト
                        tdata.velocityWeight        = wdata.stabilizationTime > 1e-6f ? 0.0f : 1.0f;
                        tdata.velocityRecoverySpeed = wdata.stabilizationTime;
                        reset = true;
                    }
                    wdata.nowPosition = bpos;
                    wdata.nowRotation = brot;

                    // 書き戻し
                    teamWorldInfluenceList[teamId] = wdata;

                    // 時間更新(タイムスケール対応)
                    UpdateTime(ref tdata, reset);

                    // リセットフラグOFF
                    tdata.SetFlag(Flag_Reset_WorldInfluence, false);

                    // 風
                    Wind(ref tdata, bpos);
                }

                // 書き戻し
                teamData[teamId] = tdata;
            }