// チームデータごと 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; }
// チームデータごと 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; }