From 4c863a8ee86f75f69230ebd0284a239185d1c655 Mon Sep 17 00:00:00 2001 From: Tungdv Date: Sat, 6 Dec 2025 18:49:21 +0700 Subject: [PATCH 1/4] fix: update move fly and swim. --- Assets/PerfectWorld/Scripts/Move/EC_CDR.cs | 76 +++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs index 9944c007d1..792b8e0c03 100644 --- a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs +++ b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs @@ -11,6 +11,7 @@ namespace BrewMonster.Scripts // Cho phép CECHostMove gán mask theo scene (giữ linh hoạt nhưng không phá cấu trúc) public static LayerMask BrushMask { get; set; } = 1<<7; public static LayerMask TerrainMask { get; set; } = 1<<6; + public static LayerMask WaterMask { get; set; } = 1<<8; const float LOCAL_EPSILON = 1e-5f; @@ -22,7 +23,7 @@ namespace BrewMonster.Scripts CDR_WATER = 0x4; } - static LayerMask UsedMask_Ground() => BrushMask | TerrainMask; + static LayerMask UsedMask_Ground() => BrushMask | TerrainMask | WaterMask; static bool CollideWithEnv(env_trace_t pEnvTrc) { @@ -569,7 +570,80 @@ namespace BrewMonster.Scripts static void AirMove(ref ON_AIR_CDR_INFO awmInfo) { + float DIST_EPSILON = 1e-4f; + int MAX_TRY = 1; + float VEL_REFLECT = 0.0f; + float fTime = awmInfo.t; + //@todo : is it necessary to clamp the speed? By Kuiwu[20/9/2005] + float fSpeed = awmInfo.fSpeed; + if (fSpeed * fTime < DIST_EPSILON) + { + //@todo : set the output param. By Kuiwu[20/9/2005] + return; + } + A3DVECTOR3 vStart = new A3DVECTOR3(awmInfo.vCenter); + A3DVECTOR3 vExt = new A3DVECTOR3(awmInfo.vExtent); + A3DVECTOR3 vVelDir = new A3DVECTOR3(awmInfo.vVelDir); + float dtp = 0f; + A3DVECTOR3 vVelocity = new A3DVECTOR3(vVelDir* fSpeed); + + if ((dtp = A3DVECTOR3.DotProduct(vVelDir, awmInfo.vTPNormal)) < 0.0f) + { + + //vVelocity = (vVelDir - awmInfo.vTPNormal * dtp - awmInfo.vTPNormal*dtp * 0.01f) * fSpeed; + vVelocity = (vVelDir - awmInfo.vTPNormal * dtp) * fSpeed; + } + + A3DVECTOR3 vDelta = new A3DVECTOR3(vVelocity* fTime), + vNormal = new A3DVECTOR3(), + vFinalPos = new A3DVECTOR3(vStart); + int nTry = 0; + bool bClear = true; + env_trace_t trcInfo; + trcInfo.bWaterSolid = true; + trcInfo.dwCheckFlag = CDR_EVN.CDR_TERRAIN | CDR_EVN.CDR_BRUSH | CDR_EVN.CDR_WATER; + trcInfo.vExt = vExt; + RaycastHit hit; + while (nTry < MAX_TRY) + { + if (vDelta.SquaredMagnitude() < DIST_EPSILON) + { + break; + } + trcInfo.vStart = vStart; + trcInfo.vDelta = vDelta; + trcInfo.vTerStart = vStart; + trcInfo.vTerStart.y -= vExt.y; + trcInfo.vWatStart = vStart; + trcInfo.vWatStart.y -= vExt.y; + //bClear = !CollideWithEnv(&trcInfo); + bClear = !Physics.Raycast(EC_Utility.ToVector3(vStart), + EC_Utility.ToVector3(vStart + vVelDir).normalized, + out hit, + EC_Utility.ToVector3(vDelta).magnitude, + UsedMask_Ground()); + ++nTry; + if (bClear) + { + vFinalPos = vStart + vDelta; + } + else + { + vFinalPos = EC_Utility.ToA3DVECTOR3(hit.point); + vNormal = EC_Utility.ToA3DVECTOR3(hit.normal); + } + //vStart += vDelta * trcInfo.fFraction; + //vFinalPos = vStart; + //fTime -= fTime * trcInfo.fFraction; + //vNormal = trcInfo.vHitNormal; + //fSpeed = A3DVECTOR3.Normalize(vVelocity,out vVelDir); + //fSpeed *= (1 - nTry * 0.1f); + //dtp = A3DVECTOR3.DotProduct(vNormal, vVelDir); + //vVelocity = (vVelDir - vNormal * dtp - vNormal * dtp * VEL_REFLECT) * fSpeed; + //vDelta = vVelocity * fTime; + + } } static void WaterMove(ref ON_AIR_CDR_INFO awmInfo) From ead70ecfea69fe79275f8882e987a6e498e39ac6 Mon Sep 17 00:00:00 2001 From: Tungdv Date: Mon, 8 Dec 2025 19:10:23 +0700 Subject: [PATCH 2/4] fix: update move air. --- Assets/PerfectWorld/Scripts/Move/EC_CDR.cs | 181 +++++++++++++++++- Assets/PerfectWorld/Scripts/World/CECWorld.cs | 6 +- .../PerfectWorld/Scripts/World/EC_Instance.cs | 48 +++++ .../Scripts/World/EC_Instance.cs.meta | 2 + Assets/Scripts/CECGameRun.cs | 21 ++ 5 files changed, 255 insertions(+), 3 deletions(-) create mode 100644 Assets/PerfectWorld/Scripts/World/EC_Instance.cs create mode 100644 Assets/PerfectWorld/Scripts/World/EC_Instance.cs.meta diff --git a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs index 792b8e0c03..a90f8b924d 100644 --- a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs +++ b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs @@ -1,4 +1,5 @@ -using BrewMonster.Scripts.World; +using BrewMonster.Network; +using BrewMonster.Scripts.World; using CSNetwork.GPDataType; using System; using UnityEngine; @@ -14,6 +15,73 @@ namespace BrewMonster.Scripts public static LayerMask WaterMask { get; set; } = 1<<8; const float LOCAL_EPSILON = 1e-5f; + const float FLY_MAX_HEIGHT = 800.0f; // ·ÉÐеÄ×î´ó¸ß¶È£¡ + + // change this array when some new submap can go! + static uint[,] available_maps = + { + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 1, 1, 1, 1, 1, 1, 1}, + {0, 1, 1, 1, 1, 1, 1, 1}, + {0, 1, 1, 1, 1, 1, 1, 0}, + {0, 1, 1, 1, 1, 1, 1, 0}, + {0, 1, 1, 1, 1, 1, 1, 0}, + {0, 1, 1, 1, 1, 1, 1, 0}, + {0, 1, 1, 1, 1, 1, 1, 0}, + {0, 1, 1, 1, 1, 1, 1, 0}, + {0, 0, 0, 0, 0, 1, 1, 0}, + {1, 1, 0, 0, 0, 0, 0, 0}, + }; + + static uint[,] available_maps4x4 = + { + {0, 0, 0, 0}, + {0, 1, 1, 0}, + {0, 1, 1, 0}, + {0, 0, 0, 0}, + }; + + static uint[,] available_maps3x3 = + { + {0, 0, 0}, + {0, 1, 0}, + {0, 0, 0}, + }; + + static uint[,] available_maps2x2 = + { + {1, 1}, + {0, 0}, + }; + + static uint[,] available_maps_137 = + { + {0, 0, 0, 0, 0, 0}, + {0, 1, 1, 1, 0, 0}, + {0, 0, 0, 0, 0, 0}, + }; + + static uint[,] available_maps_161= + { + {0, 0, 0, 0}, + {0, 1, 1, 0}, + {0, 0, 0, 0}, + }; + + static uint[,] available_maps_162 = + { + {0, 0, 0, 0}, + {0, 1, 1, 0}, + {0, 0, 0, 0}, + }; + + static uint[,] available_maps_163 = + { + {0, 0, 0, 0}, + {0, 1, 1, 0}, + {0, 1, 0, 0}, + {0, 0, 0, 0}, + }; //[Flags] public class CDR_EVN @@ -618,9 +686,11 @@ namespace BrewMonster.Scripts trcInfo.vWatStart = vStart; trcInfo.vWatStart.y -= vExt.y; //bClear = !CollideWithEnv(&trcInfo); - bClear = !Physics.Raycast(EC_Utility.ToVector3(vStart), + bClear = !Physics.BoxCast(EC_Utility.ToVector3(vStart), + EC_Utility.ToVector3(vExt), EC_Utility.ToVector3(vStart + vVelDir).normalized, out hit, + Quaternion.identity, EC_Utility.ToVector3(vDelta).magnitude, UsedMask_Ground()); ++nTry; @@ -644,12 +714,119 @@ namespace BrewMonster.Scripts //vDelta = vVelocity * fTime; } + + //@note : prevent moving to the invalid area. By Kuiwu[20/9/2005] + if (!IsPosInAvailableMap(vFinalPos)) + { + //@todo : set some flag to notify the caller? By Kuiwu[20/9/2005] + return; + } + //too high + if (vFinalPos.y > FLY_MAX_HEIGHT - 2.0f) + { + return; + } + + //see if meet height thresh + Vector3 posVStart = EC_Utility.ToVector3(vFinalPos); + float fDeltaY = awmInfo.fHeightThresh + 0.1f; + + if (!Physics.Raycast(posVStart, + (posVStart + Vector3.down * fDeltaY).normalized, + out hit, + fDeltaY, + UsedMask_Ground())) + { + awmInfo.vCenter = vFinalPos; + awmInfo.vTPNormal = vNormal; + return; + } + else + { + vFinalPos = EC_Utility.ToA3DVECTOR3(hit.point); + vNormal = EC_Utility.ToA3DVECTOR3(hit.normal); + awmInfo.vCenter = vFinalPos; + awmInfo.vTPNormal = vNormal; + } } static void WaterMove(ref ON_AIR_CDR_INFO awmInfo) { } + + ////////////////////////////////////////////////////////////////////////// + // Note by wenfeng, 05-09-16 + // This function is only for the Big world but not applicable for the + // Instance world! + // + ////////////////////////////////////////////////////////////////////////// + static bool IsPosInAvailableMap(A3DVECTOR3 vPos) + { + float x, z; + int su, sv; + + //bool bFlag = true; + CECWorld pWorld = EC_Game.GetGameRun().GetWorld(); + if(pWorld != null) + { + int idInst = pWorld.GetInstanceID(); + CECInstance pInst = EC_Game.GetGameRun().GetInstance(idInst); + if (pInst == null) + return false; + + x = vPos.x + pInst.GetColNum() * 512.0f; + z = pInst.GetRowNum() * 512.0f - vPos.z; + su = (int) (x / 1024.0f); + sv = (int) (z / 1024.0f); + + if (su >= pInst.GetColNum() || su< 0 || + + sv >= pInst.GetRowNum() || sv< 0) + return false; + + switch (idInst) + { + case 1: + return available_maps[sv, su] != 0 && vPos.x <= 3877.0f; // ½ûÖ¹ëÊ×åÁÙ½ü¿´µ½µØÍ¼±ßÔµ + + case 121: + case 122: + + return available_maps4x4[sv, su] != 0? true : false; + + case 118: + case 119: + case 120: + case 123: + case 125: + + return available_maps3x3[sv, su] != 0? true : false; + + case 134: + + return available_maps2x2[sv, su] != 0 ? true : false; + + case 137: + return available_maps_137[sv, su] != 0 ? true : false; + + case 161: + return available_maps_161[sv, su] != 0; + + case 162: + return available_maps_162[sv, su] != 0 ? true : false; + + case 163: + return available_maps_163[sv, su] != 0 ? true : false; + + default: + return true; + } + } + + else + return true; + } } public struct OtherPlayer_Move_Info { diff --git a/Assets/PerfectWorld/Scripts/World/CECWorld.cs b/Assets/PerfectWorld/Scripts/World/CECWorld.cs index afaad74d26..8d9fe95ebe 100644 --- a/Assets/PerfectWorld/Scripts/World/CECWorld.cs +++ b/Assets/PerfectWorld/Scripts/World/CECWorld.cs @@ -11,6 +11,7 @@ namespace BrewMonster.Scripts.World protected A3DTerrain2 m_pA3DTerrain; CECOrnamentMan m_pOnmtMan; uint m_dwBornStamp = 0; + int m_idInst = 161; // id of instance public uint GetBornStamp() { return m_dwBornStamp++; } @@ -26,5 +27,8 @@ namespace BrewMonster.Scripts.World { return m_pOnmtMan; } - } + + // Get id of instance + public int GetInstanceID(){ return m_idInst; } +} } diff --git a/Assets/PerfectWorld/Scripts/World/EC_Instance.cs b/Assets/PerfectWorld/Scripts/World/EC_Instance.cs new file mode 100644 index 0000000000..bca69eb721 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/World/EC_Instance.cs @@ -0,0 +1,48 @@ +using BrewMonster.Common; +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace BrewMonster.Scripts +{ + public class CECInstance + { + int m_id = 161; // Instance ID + ushort[] m_strName; // Instance name + string m_strPath; // Path + int m_iRowNum = 3; // Number of map row + int m_iColNum = 4; // Number of map column + bool m_bLimitJump = false; // Ƿ + List m_routeFiles; + + public CECInstance() + { + m_id = 161; + m_iRowNum = 3; + m_iColNum = 4; + m_bLimitJump = false; + } + + // Get instance ID + public int GetID() { return m_id; } + // Get instance name + public ushort[] GetName() { return m_strName; } + // Get instance data path + public string GetPath() { return m_strPath; } + // Get row and column number of map + public int GetRowNum(){ return m_iRowNum; } + public int GetColNum(){ return m_iColNum; } + public bool GetLimitJump(){ return m_bLimitJump; } + public List GetRouteFiles(){ return m_routeFiles; } + public bool GetPositionRelatedTexture(float x, float z, string filePath) + { + return true; + } + + // Load instance information from file + public bool Load(AWScriptFile psf) + { + return true; + } + } +} diff --git a/Assets/PerfectWorld/Scripts/World/EC_Instance.cs.meta b/Assets/PerfectWorld/Scripts/World/EC_Instance.cs.meta new file mode 100644 index 0000000000..09e4745abf --- /dev/null +++ b/Assets/PerfectWorld/Scripts/World/EC_Instance.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3d943e5add12fde4dbb6e3bea3dc4d65 \ No newline at end of file diff --git a/Assets/Scripts/CECGameRun.cs b/Assets/Scripts/CECGameRun.cs index 4c2f3ce59f..df77bf514b 100644 --- a/Assets/Scripts/CECGameRun.cs +++ b/Assets/Scripts/CECGameRun.cs @@ -5,6 +5,7 @@ using CSNetwork; using CSNetwork.GPDataType; using CSNetwork.GPDataType; using CSNetwork.Protocols.RPCData; +using System.Collections.Generic; using System.Data; using System.Threading.Tasks; using Unity.Cinemachine; @@ -27,6 +28,7 @@ public partial class CECGameRun public CECWorld GetWorld() { return m_pWorld; } + private static Dictionary m_InstTab = new Dictionary(); public void Init() { Application.targetFrameRate = 60; @@ -40,6 +42,14 @@ public partial class CECGameRun // LoadPrefabs(); EC_ManMessage.RegisterHandler(this); + + // Load instance information + //if (!LoadInstanceInfo("Configs\\instance.txt")) + //{ + // glb_ErrorOutput(ECERR_FAILEDTOCALL, "CECGameRun::Init", __LINE__); + // return false; + //} + m_InstTab.Add(161, new CECInstance()); } public static void Dispose() @@ -317,4 +327,15 @@ public partial class CECGameRun } return m_pUIManager; } + + + // Get instance by ID + public CECInstance GetInstance(int id) + { + if (m_InstTab.TryGetValue(id, out CECInstance value)) + { + return value; + } + return null; + } } From ebdb99865d52f3175be6b0a610874f24adf82a7b Mon Sep 17 00:00:00 2001 From: Tungdv Date: Tue, 9 Dec 2025 19:53:50 +0700 Subject: [PATCH 3/4] fix: update move air. --- .../Scripts/Managers/EC_HPWorkMove.cs | 305 ++++++++++++++++++ .../PerfectWorld/Scripts/Move/CECHostMove.cs | 2 +- Assets/Scenes/a61.unity | 4 +- 3 files changed, 308 insertions(+), 3 deletions(-) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs index a788cce30f..6f7cd6db9c 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs @@ -16,6 +16,19 @@ namespace BrewMonster.Scripts DEST_STANDJUMP = 4, DEST_AUTOPF = 5; // Movement type } + const float A3D_PI = 3.1415926535f; + static float DEG2RAD(float deg) => ((deg) * A3D_PI / 180.0f); + static float pitch_ang_wing => DEG2RAD(45.0f); + static float pitch_ang_fly_sword => DEG2RAD(25.0f); + static float lean_max_ang => DEG2RAD(45.0f); + static float ang_vel_fly => 1.0f / DEG2RAD(60.0f); + static float ang_vel_swim => 1.0f / DEG2RAD(180.0f); + static float pitch_co_wing => pitch_ang_wing / A3D_PI; + static float pitch_co_fly_sword => pitch_ang_fly_sword / A3D_PI; + const float sidle_co = .5f; + static float sidle_co_r => 1.0f - sidle_co; + static float push_pitch_vel_wing => pitch_ang_wing / 0.5f; + static float push_pitch_vel_fly_sword => pitch_ang_fly_sword / 0.5f; private const uint MoveInputMask = 0x0F; // MD_FORWARD | MD_RIGHT | MD_BACK | MD_LEFT @@ -865,8 +878,300 @@ namespace BrewMonster.Scripts else m_pHost.m_MoveCtrl.SendMoveCmd(vCurPos, 0, m_vMoveDest, vVel2, iMoveMode | (int)GPMoveMode.GP_MOVE_RUN); } + else if (m_iDestType == DestTypes.DEST_2D) + { + Vector3 vPushDir = Vector3.zero; + m_pHost.GetPushDir(ref vPushDir, (uint)MOVE_DIR.MD_ALL, 0f); + vPushDir.x = vPushDir.z = 0.0f; + + float fSpeed1H = m_pHost.m_vVelocity.MagnitudeH(); + float fSpeed1V = m_pHost.m_vVelocity.y; + + A3DVECTOR3 vMoveDirH = m_vMoveDest - vCurPos; + vMoveDirH.y = 0.0f; + float fDistH = vMoveDirH.Normalize(); + + float pa = 0.0f; + + // Calculate the distance to reduce velocity to 0 + float s = -0.5f * fSpeed1H * fSpeed1H / na; + if (fDistH > s - 0.01f) + pa = CECHostMove.EC_PUSH_ACCE; + + float fSpeed2H = fSpeed1H + (pa + na) * fDeltaTime; + if (Math.Abs(pa - 0f) < float.Epsilon && fSpeed2H < 0.0f) + fSpeed2H = 0.0f; // Only resistance couldn't generate negative speed + else if (fSpeed2H > fMaxSpeed) + fSpeed2H = fMaxSpeed; + + Glide(fDistH / fMaxSpeed, vMoveDirH, fDeltaTime, bInAir); + + vMoveDirH = m_pHost.GetModelMoveDir(); + vMoveDirH.y = 0; + vMoveDirH.Normalize(); + + // Vertical speed + float fSpeed2V = CalcFlySwimVertSpeed(fSpeed1V, vPushDir.y, CECHostMove.EC_PUSH_ACCE, fDeltaTime); + A3DVECTOR3 vVel2 = vMoveDirH * fSpeed2H + GPDataTypeHelper.g_vAxisY * fSpeed2V; + + // Air/water move + vCurPos = m_pHost.m_MoveCtrl.AirWaterMove(vVel2, fDeltaTime, bInAir); + + if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) + { + vVel2.Clear(); + Finish(); + } + else + { + // Reached destination ? + A3DVECTOR3 vMoveDelta = vCurPos - m_pHost.GetPos(); + vMoveDelta.y = 0.0f; + float fMoveDistH = vMoveDelta.Normalize(); + if (fMoveDistH >= fDistH) + { + vVel2.x = vVel2.z = 0.0f; + if (Math.Abs(vVel2.y - 0f) < float.Epsilon) + { + Finish(); + } + else + { + if (m_bUseAutoMoveDialog) + { + Finish(); + vVel2.y = 0.0f; + } + + m_iDestType = DestTypes.DEST_PUSH; + } + } + } + + m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); + m_pHost.m_vVelocity = vVel2; + + if (m_bFinished) + m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), vVel2.Magnitude(), iMoveMode | (int)GPMoveMode.GP_MOVE_RUN); + else + m_pHost.m_MoveCtrl.SendMoveCmd(vCurPos, 0, m_vMoveDest, vVel2, iMoveMode | (int)GPMoveMode.GP_MOVE_RUN); + } + else if (m_iDestType == DestTypes.DEST_3D) + { + float fSpeed1 = m_pHost.m_vVelocity.Magnitude(); + A3DVECTOR3 vMoveDir = m_vMoveDest - vCurPos; + float fDist = vMoveDir.Normalize(); + + float pa = 0.0f; + + // Calculate the distance to reduce velocity to 0 + float s = -0.5f * fSpeed1 * fSpeed1 / na; + if (fDist > s - 0.01f) + pa = CECHostMove.EC_PUSH_ACCE; + + float fSpeed2 = fSpeed1 + (pa + na) * fDeltaTime; + if (Math.Abs(pa - 0f) < float.Epsilon && fSpeed2 < 0.0f) + fSpeed2 = 0.0f; // Only resistance couldn't generate negative speed + + AAssist.a_Clamp(ref fSpeed2, -fMaxSpeed, fMaxSpeed); + + Vector3 vMoveDirH = new Vector3(vMoveDir.x, 0.0f, vMoveDir.z); + if (vMoveDirH != Vector3.zero) + { + //m_pHost.StartModelMove(vMoveDirH, g_vAxisY, 100); + //m_pHost.ChangeModelTargetDirAndUp(vMoveDirH, g_vAxisY); + m_pHost.SetRotationHP(vMoveDirH); + } + + // Air/water move + // A3DVECTOR3 vVel1 = vMoveDir * fSpeed1; + A3DVECTOR3 vVel2 = vMoveDir * fSpeed2; + vCurPos = m_pHost.m_MoveCtrl.AirWaterMove(vMoveDir, fSpeed2, fDeltaTime, bInAir, false); + + if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) + { + vVel2.Clear(); + Finish(); + } + else + { + // Reached destination ? + A3DVECTOR3 vMoveDelta = vCurPos - m_pHost.GetPos(); + float fMoveDist = vMoveDelta.Normalize(); + if (fMoveDist >= fDist) + { + vVel2.Clear(); + Finish(); + m_bUseAutoMoveDialog = false; + } + } + + m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); + m_pHost.m_vVelocity = vVel2; + + if (m_bFinished) + m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fMaxSpeed, iMoveMode | (int)GPMoveMode.GP_MOVE_RUN); + else + m_pHost.m_MoveCtrl.SendMoveCmd(vCurPos, 1, m_vMoveDest, vVel2, iMoveMode | (int)GPMoveMode.GP_MOVE_RUN); + } + else if (m_iDestType == DestTypes.DEST_PUSH) + { + Vector3 vPushDir = Vector3.zero, vUp; + bool bPush = m_pHost.GetPushDir(ref vPushDir, (uint)(MOVE_DIR.MD_FORWARD | MOVE_DIR.MD_BACK | MOVE_DIR.MD_LEFT | MOVE_DIR.MD_RIGHT), fDeltaTime); + + if (!bPush) + { + //vPushDir = m_pHost.GetCameraCoord().GetDir(); + vPushDir.y = 0; + vPushDir.Normalize(); + } + + int nPitchDir = 0; + if ((m_pHost.m_dwMoveRelDir & (int)(MOVE_DIR.MD_LEFT | MOVE_DIR.MD_RIGHT)) == 0) + { + A3DVECTOR3 vOldDir = m_pHost.GetModelMoveDir(); + vOldDir.y = 0; + vOldDir.Normalize(); + + A3DVECTOR3 vNewDir = EC_Utility.ToA3DVECTOR3(vPushDir); + vNewDir.y = 0; + vNewDir.Normalize(); + + float fAngle = A3DVECTOR3.DotProduct(vOldDir, vNewDir); + if (fAngle < 1.0f - 1e-4) + { + A3DVECTOR3 vUp_fAngle = A3DVECTOR3.CrossProduct(vOldDir, vNewDir); + if (vUp_fAngle.y > 0) nPitchDir = 1; + else nPitchDir = -1; + if ((m_pHost.m_dwMoveRelDir & (uint)MOVE_DIR.MD_BACK) != 0) + nPitchDir = -nPitchDir; + } + } + + if (m_pHost.m_dwMoveRelDir != 0) + { + if ((m_pHost.m_dwMoveRelDir & ~(uint)(MOVE_DIR.MD_ABSDOWN | MOVE_DIR.MD_ABSUP)) != 0) + { + float fPitchDelta = (/*m_pHost.UsingWing()*/m_pHost.GetWingType() == enumWingType.WINGTYPE_WING ? push_pitch_vel_wing : push_pitch_vel_fly_sword) * fDeltaTime; + + if ((m_pHost.m_dwMoveRelDir & (uint)MOVE_DIR.MD_LEFT) != 0 || nPitchDir == -1) + { + if ((m_pHost.m_dwMoveRelDir & (uint)MOVE_DIR.MD_BACK) != 0) + m_fPushPitch -= fPitchDelta; + else + m_fPushPitch += fPitchDelta; + } + else if ((m_pHost.m_dwMoveRelDir & (uint)MOVE_DIR.MD_RIGHT) != 0 || nPitchDir == 1) + { + if ((m_pHost.m_dwMoveRelDir & (uint)MOVE_DIR.MD_BACK) != 0) + m_fPushPitch += fPitchDelta; + else + m_fPushPitch -= fPitchDelta; + } + else if (m_fPushPitch > fPitchDelta) + m_fPushPitch -= fPitchDelta; + else if (m_fPushPitch < -fPitchDelta) + m_fPushPitch += fPitchDelta; + else + m_fPushPitch = 0; + // TO DO: fix after + //A3DVECTOR3 vRight = m_pHost.GetCameraCoord().GetRight(); + //float fLean = -Math.Asin(m_pHost.GetCameraCoord().GetDir().y); + //AAssist.a_Clamp(ref fLean, -lean_max_ang, lean_max_ang); + + //if (Math.Abs(fLean) > DEG2RAD(3.0f)) + //{ + // vPushDir = a3d_RotatePosAroundAxis(vPushDir, vRight, fLean); + // vUp = a3d_RotatePosAroundAxis(g_vAxisY, vRight, fLean); + //} + //else + // vUp = EC_Utility.ToVector3(GPDataTypeHelper.g_vAxisY); + + //float pitch_ang = /*m_pHost.UsingWing()*/ m_pHost.GetWingType() == enumWingType.WINGTYPE_WING ? pitch_ang_wing : pitch_ang_fly_sword; + //AAssist.a_Clamp(ref m_fPushPitch, -pitch_ang, pitch_ang); + + //if (Math.Abs(m_fPushPitch) > DEG2RAD(4.0f)) + // vUp = a3d_RotatePosAroundAxis(vUp, vPushDir, m_fPushPitch); + + //m_pHost.StartModelMove(vPushDir, vUp, 0); + } + + // if (bPush) + if (bPush || (m_pHost.m_dwMoveRelDir & (uint)(MOVE_DIR.MD_ABSDOWN | MOVE_DIR.MD_ABSUP)) != 0) + { + // float pa = bPush ? EC_PUSH_ACCE : 0.0f; + float pa = CECHostMove.EC_PUSH_ACCE; + float na1 = m_pHost.m_iMoveEnv == (int)MoveEnvironment.MOVEENV_AIR ? CECHostMove.EC_NACCE_AIR : CECHostMove.EC_NACCE_WATER; + float fAccel = pa + na1; + + float fSpeed1 = m_pHost.m_vVelocity.Magnitude(); + float fSpeed2 = fSpeed1 + fAccel * fDeltaTime; + AAssist.a_Clamp(ref fSpeed2, 0.0f, fMaxSpeed); + + // Air/water move + Vector3 vVelDir = Vector3.zero; + if (bPush) + vVelDir = vPushDir; + + if ((m_pHost.m_dwMoveRelDir & (uint)MOVE_DIR.MD_ABSDOWN) != 0) + { + vVelDir += -EC_Utility.ToVector3(GPDataTypeHelper.g_vAxisY); + vVelDir.Normalize(); + } + else if ((m_pHost.m_dwMoveRelDir & (uint)MOVE_DIR.MD_ABSUP) != 0) + { + vVelDir += EC_Utility.ToVector3(GPDataTypeHelper.g_vAxisY); + vVelDir.Normalize(); + } + + // A3DVECTOR3 vVel = vPushDir * fSpeed2; + Vector3 vVel = vVelDir * fSpeed2; + vCurPos = m_pHost.m_MoveCtrl.AirWaterMove(EC_Utility.ToA3DVECTOR3(vVel), fDeltaTime, bInAir); + + if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) + { + Finish(); + m_pHost.m_vVelocity.Clear(); + m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fMaxSpeed, iMoveMode | (int)GPMoveMode.GP_MOVE_RUN); + } + else + { + m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); + if (m_bUseAutoMoveDialog) + { + m_fAutoHeight = vCurPos.y / 10.0f; + } + m_pHost.m_vVelocity = EC_Utility.ToA3DVECTOR3(vVel); + m_pHost.m_MoveCtrl.SendMoveCmd(vCurPos, 2, GPDataTypeHelper.g_vOrigin, EC_Utility.ToA3DVECTOR3(vVel), iMoveMode | (int)GPMoveMode.GP_MOVE_RUN); + } + } + } + else + { + if (!m_bUseAutoMoveDialog) + Finish(); + else + m_iDestType = DestTypes.DEST_2D; + + m_fPushPitch = 0; + m_pHost.m_vVelocity.Clear(); + m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fMaxSpeed, iMoveMode | (int)GPMoveMode.GP_MOVE_RUN); + } + } + else if (m_iDestType == DestTypes.DEST_STANDJUMP) + { + // If host player fly off when jumping up, code will go here. In the + // case, just stop move work is well. + Finish(); + } + else if (IsAutoPF()) + { + //CECIntelligentRoute::Instance().ResetSearch(); + m_bSwitchTo2D = true; + } return true; } + // Start gliding protected void Glide(float fMoveTime, A3DVECTOR3 vMoveDirH, float fDeltaTime, bool bFly) { diff --git a/Assets/PerfectWorld/Scripts/Move/CECHostMove.cs b/Assets/PerfectWorld/Scripts/Move/CECHostMove.cs index c9b85c246e..a38adb2f5b 100644 --- a/Assets/PerfectWorld/Scripts/Move/CECHostMove.cs +++ b/Assets/PerfectWorld/Scripts/Move/CECHostMove.cs @@ -363,7 +363,7 @@ namespace BrewMonster { } // Air/Water move - A3DVECTOR3 AirWaterMove(A3DVECTOR3 vDir, float fSpeed, float fTime, bool bInAir, bool bTrace/* false */) + public A3DVECTOR3 AirWaterMove(A3DVECTOR3 vDir, float fSpeed, float fTime, bool bInAir, bool bTrace/* false */) { A3DVECTOR3 vRealDir = vDir; diff --git a/Assets/Scenes/a61.unity b/Assets/Scenes/a61.unity index 87f4939c37..39612cbb2f 100644 --- a/Assets/Scenes/a61.unity +++ b/Assets/Scenes/a61.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94045fc7eb49643c229531f88aa7ac1d8a6f59d3e0d2bfb5a4939f9b3fb0ed04 -size 200173095 +oid sha256:c355a15afcfbfbdeee575565bc08b5e85a2531d5871aa8abc751073226d340a9 +size 200173673 From 21f41ecae1165782c7cb5fba19a8892f5fc062d1 Mon Sep 17 00:00:00 2001 From: Tungdv Date: Wed, 10 Dec 2025 17:18:38 +0700 Subject: [PATCH 4/4] feat: add rotation cam. --- .../Prefab/FreeLook Camera.prefab | 230 ++++++++++++++++++ .../Prefab/FreeLook Camera.prefab.meta | 7 + .../PerfectWorld/Prefab/GameController.prefab | 99 +++++++- .../Scripts/Camera/CameraController.cs | 38 ++- Assets/Scenes/a61.unity | 4 +- 5 files changed, 373 insertions(+), 5 deletions(-) create mode 100644 Assets/PerfectWorld/Prefab/FreeLook Camera.prefab create mode 100644 Assets/PerfectWorld/Prefab/FreeLook Camera.prefab.meta diff --git a/Assets/PerfectWorld/Prefab/FreeLook Camera.prefab b/Assets/PerfectWorld/Prefab/FreeLook Camera.prefab new file mode 100644 index 0000000000..adc5d9379e --- /dev/null +++ b/Assets/PerfectWorld/Prefab/FreeLook Camera.prefab @@ -0,0 +1,230 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &4998203355105501952 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1628544740079825057} + - component: {fileID: 2396821685412871444} + - component: {fileID: 7258523983903280597} + - component: {fileID: 2200587088708437140} + - component: {fileID: 8677225758390490087} + m_Layer: 0 + m_Name: FreeLook Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1628544740079825057 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4998203355105501952} + serializedVersion: 2 + m_LocalRotation: {x: 0.23378472, y: -1.6779091e-15, z: 8.341431e-16, w: 0.9722884} + m_LocalPosition: {x: -736.68787, y: 50.89, z: -269.46097} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2396821685412871444 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4998203355105501952} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f9dfa5b682dcd46bda6128250e975f58, type: 3} + m_Name: + m_EditorClassIdentifier: + Priority: + Enabled: 0 + m_Value: 0 + OutputChannel: 1 + StandbyUpdate: 2 + m_StreamingVersion: 20241001 + m_LegacyPriority: 0 + Target: + TrackingTarget: {fileID: 0} + LookAtTarget: {fileID: 0} + CustomLookAtTarget: 0 + Lens: + FieldOfView: 60.000004 + OrthographicSize: 5 + NearClipPlane: 0.3 + FarClipPlane: 200 + Dutch: 0 + ModeOverride: 0 + PhysicalProperties: + GateFit: 2 + SensorSize: {x: 21.946, y: 16.002} + LensShift: {x: 0, y: 0} + FocusDistance: 10 + Iso: 200 + ShutterSpeed: 0.005 + Aperture: 16 + BladeCount: 5 + Curvature: {x: 2, y: 11} + BarrelClipping: 0.25 + Anamorphism: 0 + BlendHint: 0 +--- !u!114 &7258523983903280597 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4998203355105501952} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3b5d7c088409d9a40b7b09aa707777f8, type: 3} + m_Name: + m_EditorClassIdentifier: + TargetOffset: {x: 0, y: 4, z: 0} + TrackerSettings: + BindingMode: 4 + PositionDamping: {x: 1, y: 1, z: 1} + AngularDampingMode: 0 + RotationDamping: {x: 1, y: 1, z: 1} + QuaternionDamping: 1.52 + OrbitStyle: 1 + Radius: 1 + Orbits: + Top: + Radius: 0.03 + Height: 7.26 + Center: + Radius: 8.33 + Height: 5.99 + Bottom: + Radius: 4.29 + Height: -4.04 + SplineCurvature: 0 + RecenteringTarget: 2 + HorizontalAxis: + Value: 208 + Center: 0 + Range: {x: -360, y: 360} + Wrap: 0 + Recentering: + Enabled: 0 + Wait: 1 + Time: 2 + Restrictions: 0 + VerticalAxis: + Value: -268 + Center: 20 + Range: {x: -360, y: 360} + Wrap: 1 + Recentering: + Enabled: 0 + Wait: 1 + Time: 2 + Restrictions: 0 + RadialAxis: + Value: 1 + Center: 1 + Range: {x: 1, y: 1} + Wrap: 0 + Recentering: + Enabled: 0 + Wait: 1 + Time: 2 + Restrictions: 0 +--- !u!114 &2200587088708437140 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4998203355105501952} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f38bda98361e1de48a4ca2bd86ea3c17, type: 3} + m_Name: + m_EditorClassIdentifier: + Composition: + ScreenPosition: {x: 0, y: 0} + DeadZone: + Enabled: 0 + Size: {x: 0.2, y: 0.2} + HardLimits: + Enabled: 0 + Size: {x: 0.8, y: 0.8} + Offset: {x: 0, y: 0} + CenterOnActivate: 1 + TargetOffset: {x: 0, y: 1.5, z: 0} + Damping: {x: 0.5, y: 0.5} + Lookahead: + Enabled: 0 + Time: 0 + Smoothing: 0 + IgnoreY: 0 +--- !u!114 &8677225758390490087 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4998203355105501952} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 89875cdc57c54474a8a74efd9b2a3b5d, type: 3} + m_Name: + m_EditorClassIdentifier: + ScanRecursively: 1 + SuppressInputWhileBlending: 1 + IgnoreTimeScale: 0 + m_ControllerManager: + Controllers: + - Name: Look Orbit X + Owner: {fileID: 7258523983903280597} + Enabled: 1 + Input: + InputAction: {fileID: -5630151704836100654, guid: 1d6e640e716dc4ff6989b73d02023f2b, type: 3} + Gain: 1 + LegacyInput: + LegacyGain: 1 + CancelDeltaTime: 0 + InputValue: 0 + Driver: + AccelTime: 0.2 + DecelTime: 0.2 + - Name: Look Orbit Y + Owner: {fileID: 7258523983903280597} + Enabled: 1 + Input: + InputAction: {fileID: -5630151704836100654, guid: 1d6e640e716dc4ff6989b73d02023f2b, type: 3} + Gain: -1 + LegacyInput: + LegacyGain: 1 + CancelDeltaTime: 0 + InputValue: 0 + Driver: + AccelTime: 0.2 + DecelTime: 0.2 + - Name: Orbit Scale + Owner: {fileID: 7258523983903280597} + Enabled: 1 + Input: + InputAction: {fileID: -423771258819551211, guid: 1d6e640e716dc4ff6989b73d02023f2b, type: 3} + Gain: -1 + LegacyInput: + LegacyGain: 1 + CancelDeltaTime: 0 + InputValue: 0 + Driver: + AccelTime: 0 + DecelTime: 0 + PlayerIndex: -1 + AutoEnableInputs: 0 diff --git a/Assets/PerfectWorld/Prefab/FreeLook Camera.prefab.meta b/Assets/PerfectWorld/Prefab/FreeLook Camera.prefab.meta new file mode 100644 index 0000000000..150de77291 --- /dev/null +++ b/Assets/PerfectWorld/Prefab/FreeLook Camera.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: cc901dd976e0838499b18a0b802b81d7 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Prefab/GameController.prefab b/Assets/PerfectWorld/Prefab/GameController.prefab index d1c67fc260..d966f2e4ee 100644 --- a/Assets/PerfectWorld/Prefab/GameController.prefab +++ b/Assets/PerfectWorld/Prefab/GameController.prefab @@ -1,5 +1,98 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &1907375868528687128 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3488899534283412697} + - component: {fileID: 7907247812297230186} + - component: {fileID: 4758101108332602619} + - component: {fileID: 1387587181254949733} + m_Layer: 0 + m_Name: AreaTouchCam + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3488899534283412697 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1907375868528687128} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3233441867675090637} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7907247812297230186 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1907375868528687128} + m_CullTransparentMesh: 1 +--- !u!114 &4758101108332602619 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1907375868528687128} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1387587181254949733 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1907375868528687128} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cbda204e0e5552e4692f0f5e234f062d, type: 3} + m_Name: + m_EditorClassIdentifier: + _cinemachineCamera: {fileID: 0} + orbital: {fileID: 0} + minSwipeDistance: 10 + speedX: 300 + speedY: 500 --- !u!1 &2486392142327362049 GameObject: m_ObjectHideFlags: 0 @@ -30,7 +123,8 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} m_ConstrainProportionsScale: 0 - m_Children: [] + m_Children: + - {fileID: 3488899534283412697} m_Father: {fileID: 2780428059708698453} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -59,7 +153,7 @@ Canvas: m_AdditionalShaderChannelsFlag: 0 m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 - m_SortingOrder: 100 + m_SortingOrder: -1 m_TargetDisplay: 0 --- !u!114 &1184637750286334292 MonoBehaviour: @@ -152,3 +246,4 @@ MonoBehaviour: currentTargetNPCID: 0 dialogResouce: {fileID: 11400000, guid: 540bc8e61556ba4479407a2d68e17580, type: 2} canvasDlg: {fileID: 7894129013412138377} + cDlgQuickBar: {fileID: 0} diff --git a/Assets/PerfectWorld/Scripts/Camera/CameraController.cs b/Assets/PerfectWorld/Scripts/Camera/CameraController.cs index 4c5f6d96c6..215106bc54 100644 --- a/Assets/PerfectWorld/Scripts/Camera/CameraController.cs +++ b/Assets/PerfectWorld/Scripts/Camera/CameraController.cs @@ -1,11 +1,45 @@ using Unity.Cinemachine; using UnityEngine; +using UnityEngine.EventSystems; namespace BrewMonster { - public class CameraController : MonoBehaviour + public class CameraController : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler { [SerializeField]private CinemachineCamera _cinemachineCamera; + [SerializeField]private CinemachineOrbitalFollow orbital; + private Vector2 currentPos; + private bool fingerDown = false; + Vector2 delta = Vector2.zero; + public float minSwipeDistance = 10f; + public float speedX = 1f; + public float speedY = 1f; + + public void OnDrag(PointerEventData eventData) + { + delta = eventData.position - currentPos; + + if (delta.magnitude >= minSwipeDistance) + { + orbital.HorizontalAxis.Value += delta.normalized.x * speedX * Time.deltaTime; + //orbital.HorizontalAxis.Value = Mathf.Clamp(orbital.HorizontalAxis.Value, -360f, 360f); + orbital.VerticalAxis.Value += delta.normalized.y * speedY * Time.deltaTime; + orbital.VerticalAxis.Value = Mathf.Clamp(orbital.VerticalAxis.Value, -360f, 360f); + } + currentPos = eventData.position; + } + + public void OnPointerDown(PointerEventData eventData) + { + currentPos = eventData.position; + fingerDown = true; + } + + public void OnPointerUp(PointerEventData eventData) + { + fingerDown = false; + } + private void Update() { //todo: should not always update @@ -13,6 +47,8 @@ namespace BrewMonster { _cinemachineCamera.Follow = CECGameRun.Instance.GetHostPlayer().transform; _cinemachineCamera.ForceCameraPosition(CECGameRun.Instance.GetHostPlayer().transform.position, Quaternion.identity); + orbital.HorizontalAxis.Value = 208; + orbital.VerticalAxis.Value = -268; } } } diff --git a/Assets/Scenes/a61.unity b/Assets/Scenes/a61.unity index 39612cbb2f..34d5ec3ea5 100644 --- a/Assets/Scenes/a61.unity +++ b/Assets/Scenes/a61.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c355a15afcfbfbdeee575565bc08b5e85a2531d5871aa8abc751073226d340a9 -size 200173673 +oid sha256:8003b60a4af29a6f7767b8b3f782a1f7fd576ce667bdbcfd0124f3071e3e5c0d +size 200174193