From 1234dd9393a02136a32b625dbd912efc60e1b03a Mon Sep 17 00:00:00 2001 From: GoaLitiuM Date: Thu, 8 Apr 2021 19:31:01 +0300 Subject: [PATCH] movement stuff --- .gitignore | 2 + .../ConsoleUiCanvasPrefab.prefab | 0 Content/GameSettings.json | 3 +- Content/Scenes/MainScene.scene | 29 +- Content/Settings/InputSettings.json | 10 +- Content/Settings/PhysicsSettings.json | 4 +- Content/Settings/TimeSettings.json | 2 +- Content/aerowalk/DefaultMaterial.flax | Bin 816 -> 29820 bytes .../Cabrito/Console/ConsoleContentTextBox.cs | 4 +- Source/Game/Cabrito/Console/ConsoleScript.cs | 50 +-- Source/Game/PlayerMovement.cs | 285 +++++++++++++----- 11 files changed, 248 insertions(+), 141 deletions(-) rename Content/{Settings => Common}/ConsoleUiCanvasPrefab.prefab (100%) diff --git a/.gitignore b/.gitignore index 92425e7..f4dbcda 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,5 @@ Output/* .vscode/ Assets/ Source/obj/ +.idea/* +*.DotSettings.user diff --git a/Content/Settings/ConsoleUiCanvasPrefab.prefab b/Content/Common/ConsoleUiCanvasPrefab.prefab similarity index 100% rename from Content/Settings/ConsoleUiCanvasPrefab.prefab rename to Content/Common/ConsoleUiCanvasPrefab.prefab diff --git a/Content/GameSettings.json b/Content/GameSettings.json index 2edb260..c11e100 100644 --- a/Content/GameSettings.json +++ b/Content/GameSettings.json @@ -1,13 +1,14 @@ { "ID": "3c7bc3854d42f9b1b0fea9ba0d7fa8e9", "TypeName": "FlaxEditor.Content.Settings.GameSettings", - "EngineBuild": 6216, + "EngineBuild": 6217, "Data": { "ProductName": "Goake", "CompanyName": "GoaLitiuM", "FirstScene": "0733cc9b40d3d05366be64bbd9b59e21", "NoSplashScreen": true, "Time": "a55dc3c04da4ea3744b7f1994565beac", + "Physics": "4bd8a4cc460399b5f1975fbe0a668e3f", "Input": "8ec53dba4c238bfbea1d62922e612a4d", "Graphics": "f94d5aae457aeba67033a8a4ca753214", "GameCooking": "af2e52554f7faed7b4937181dd22d166", diff --git a/Content/Scenes/MainScene.scene b/Content/Scenes/MainScene.scene index 40df51d..47529da 100644 --- a/Content/Scenes/MainScene.scene +++ b/Content/Scenes/MainScene.scene @@ -31,12 +31,11 @@ "Name": "PlayerPrefab", "Transform": { "Translation": { - "X": -82.89323425292969, - "Y": 111.32740783691406, - "Z": 114.5750503540039 + "X": -913.1759033203125, + "Y": 207.86880493164063, + "Z": 433.89312744140627 } }, - "Mass": 3784.5869140625, "LinearDamping": 0.0, "AngularDamping": 0.0, "Constraints": 56, @@ -82,10 +81,26 @@ "W": 0.7071068286895752 } }, + "IsTrigger": true, + "ContactOffset": 0.0, "Material": "ffe0e84c49607480f67a3994a7fe11a8", "Radius": 16.0, "Height": 52.0 }, + { + "ID": "9677298d46e5d5d7021f7cb607bd3023", + "TypeName": "FlaxEngine.BoxCollider", + "ParentID": "4ef1f38b4569142b55b0ff935525d47a", + "IsActive": false, + "Name": "BoxCollider", + "IsTrigger": true, + "Material": "ffe0e84c49607480f67a3994a7fe11a8", + "Size": { + "X": 32.0, + "Y": 84.0, + "Z": 32.0 + } + }, { "ID": "b5d566374477944e69bdc2b86249883b", "TypeName": "FlaxEngine.UICanvas", @@ -114,7 +129,7 @@ "TypeName": "Cabrito.ConsoleScript", "ParentID": "b5d566374477944e69bdc2b86249883b", "V": { - "ConsoleFont": "ec3a34464c0c59c40c52a29f469f161f", + "ConsoleFont": "43f32bec443158643f53699f07b2e09c", "BackgroundColor": { "R": 0.0, "G": 0.0, @@ -131,13 +146,13 @@ "Transform": { "Translation": { "X": 0.0, - "Y": 733.0, + "Y": 887.0, "Z": 0.0 } }, "Control": "FlaxEngine.GUI.Label", "Data": { - "Text": "FPS: 14\nrFPS: 13\nCon: NaNms\nDirectX11\nGC memory: 15.89691MB", + "Text": "FPS: 120\nrFPS: 120\nCon: NaNms\nDirectX11\nGC memory: 8.103872MB", "TextColor": { "R": 1.0, "G": 1.0, diff --git a/Content/Settings/InputSettings.json b/Content/Settings/InputSettings.json index 9af1a14..cc6ebfc 100644 --- a/Content/Settings/InputSettings.json +++ b/Content/Settings/InputSettings.json @@ -1,7 +1,7 @@ { "ID": "8ec53dba4c238bfbea1d62922e612a4d", "TypeName": "FlaxEditor.Content.Settings.InputSettings", - "EngineBuild": 6216, + "EngineBuild": 6217, "Data": { "ActionMappings": [ { @@ -59,6 +59,14 @@ "MouseButton": 0, "GamepadButton": 0, "Gamepad": 0 + }, + { + "Name": "Jump", + "Mode": 0, + "Key": 32, + "MouseButton": 3, + "GamepadButton": 0, + "Gamepad": 0 } ], "AxisMappings": [ diff --git a/Content/Settings/PhysicsSettings.json b/Content/Settings/PhysicsSettings.json index f27ddb7..459c603 100644 --- a/Content/Settings/PhysicsSettings.json +++ b/Content/Settings/PhysicsSettings.json @@ -1,11 +1,11 @@ { "ID": "4bd8a4cc460399b5f1975fbe0a668e3f", "TypeName": "FlaxEditor.Content.Settings.PhysicsSettings", - "EngineBuild": 6216, + "EngineBuild": 6217, "Data": { "DefaultGravity": { "X": 0.0, - "Y": -9810.0, + "Y": -800.0, "Z": 0.0 }, "QueriesHitTriggers": true, diff --git a/Content/Settings/TimeSettings.json b/Content/Settings/TimeSettings.json index 10aa2a4..e460eb1 100644 --- a/Content/Settings/TimeSettings.json +++ b/Content/Settings/TimeSettings.json @@ -1,7 +1,7 @@ { "ID": "a55dc3c04da4ea3744b7f1994565beac", "TypeName": "FlaxEditor.Content.Settings.TimeSettings", - "EngineBuild": 6216, + "EngineBuild": 6217, "Data": { "UpdateFPS": 120.0, "PhysicsFPS": 60.0, diff --git a/Content/aerowalk/DefaultMaterial.flax b/Content/aerowalk/DefaultMaterial.flax index 9ed7fd007b389b2e7ba2532ab9293caffb8992eb..b5d083cc2687398cb88e5a3668757ee3fd09965b 100644 GIT binary patch literal 29820 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%0Av33omouR`=$Mr;fV%t|uoG$vr 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 Q{uLW*)1wzqZmj740K1C-1poj5 delta 40 rcmezKf^h@egf)Bz7#J8Bf%pWF$Y7j!>>B5PAW#8{Fl=7RIGqsyB$Eyx diff --git a/Source/Game/Cabrito/Console/ConsoleContentTextBox.cs b/Source/Game/Cabrito/Console/ConsoleContentTextBox.cs index 53e625f..039cc86 100644 --- a/Source/Game/Cabrito/Console/ConsoleContentTextBox.cs +++ b/Source/Game/Cabrito/Console/ConsoleContentTextBox.cs @@ -97,9 +97,7 @@ namespace Cabrito if (font == null) return (int)Height; - int h = (int)Mathf.Round(LineSpacing * (font.Height / Platform.DpiScale) * Scale.Y); - Console.Print("height: " + LineSpacing.ToString()); - return h; + return (int)Mathf.Round(LineSpacing * (font.Height / Platform.DpiScale) * Scale.Y); } private int GetHeightInLines() diff --git a/Source/Game/Cabrito/Console/ConsoleScript.cs b/Source/Game/Cabrito/Console/ConsoleScript.cs index df72043..9a08d54 100644 --- a/Source/Game/Cabrito/Console/ConsoleScript.cs +++ b/Source/Game/Cabrito/Console/ConsoleScript.cs @@ -182,7 +182,6 @@ namespace Cabrito } Console.RegisterConsoleScript(this); - RefreshLayout(); #if false //for (int i = 0; i < 10; i++) @@ -263,6 +262,12 @@ namespace Cabrito Console.OnOpen += () => { Screen.CursorVisible = true; Screen.CursorLock = CursorLockMode.None; }; Console.OnClose += () => { Screen.CursorVisible = false; Screen.CursorLock = CursorLockMode.Locked; }; + + // hide console by default, and close it instantly + Console.Close(); + var rootlocation = rootControl.Control.Location; + rootlocation.Y = -rootControl.Control.Height; + rootControl.Control.Location = rootlocation; } private void OnSendLog(LogType level, string msg, FlaxEngine.Object obj, string stackTrace) @@ -287,36 +292,6 @@ namespace Cabrito Debug.Logger.LogHandler.SendExceptionLog -= OnSendExceptionLog; } - public void RefreshLayout() - { - if (consoleBox == null || consoleInputBox == null) - return; - - //consoleBox.SetAnchorPreset(AnchorPresets.StretchAll, true); - //consoleBox.AnchorMax = new Vector2(1.0f, ConsoleHeight); - - - Vector2 screenSize = Screen.Size; - Vector2 consoleSize = new Vector2(screenSize.X, screenSize.Y * ConsoleHeight); - - //consoleBox.Height = consoleSize.Y - consoleBox.GetFontHeight(); - - //consoleInputBox.SetAnchorPreset(AnchorPresets.HorizontalStretchTop, true); - //consoleInputBox.Location = new Vector2(0, consoleBox.Bottom); - //Font fontRaw = consoleBox.Font.GetFont(); - //consoleBox.Height -= fontRaw.Height; - - /*float fontHeight = consoleBox.GetFontHeight(); - Vector2 screenSize = Screen.Size; - Vector2 consoleSize = new Vector2(screenSize.X, screenSize.Y * ConsoleHeight); - - consoleBox.Height = consoleSize.Y - fontHeight; - - consoleInputBox.Location = new Vector2(0, consoleBox.Height); - consoleInputBox.Height = fontHeight; - consoleInputBox.ScrollToCaret();*/ - } - private void OnConsoleInputEvent() { string currentInput = Input.InputText; @@ -363,23 +338,10 @@ namespace Cabrito Parent.As().ReceivesEvents = false; } - bool firstUpdate = true; public override void OnUpdate() { base.OnUpdate(); - // HACK: workaround for cursor not getting hidden in editor after entering play mode - if (firstUpdate) - { - firstUpdate = false; - Console.Close(); - - // hide console by default - var rootlocation = rootControl.Control.Location; - rootlocation.Y = -rootControl.Control.Height; - rootControl.Control.Location = rootlocation; - } - float targetY; if (!Console.IsOpen) targetY = -rootControl.Control.Height; diff --git a/Source/Game/PlayerMovement.cs b/Source/Game/PlayerMovement.cs index 960ed57..c0db012 100644 --- a/Source/Game/PlayerMovement.cs +++ b/Source/Game/PlayerMovement.cs @@ -1,4 +1,5 @@ -using FlaxEngine; +using System.Collections.Generic; +using FlaxEngine; using Cabrito; using System.Diagnostics; using System.Threading.Tasks; @@ -45,115 +46,235 @@ namespace Game viewRoll = initialEulerAngles.Z; } - //Vector3 wishVelocity = Vector3.Zero; - Vector3 gravityVelocity = Vector3.Zero; - public override void OnFixedUpdate() + private RayCastHit[] TracePlayer(Vector3 start, Vector3 end) { - var camera = rootActor.GetChild(); - var camTrans = camera.Transform; - var rootTrans = rootActor.Transform; - - float inputH = InputManager.GetAxis("Horizontal"); - float inputV = InputManager.GetAxis("Vertical"); - var move = new Vector3(inputH, 0.0f, inputV); - - var rigidBody = Actor.As(); - - const float groundAccel = 30 * 100f; - //const float groundDamping = 30f * 100; - var moveDirection = rootTrans.TransformDirection(move); - - Vector3 wishVelocity = Vector3.Zero; - if (!Console.IsOpen && !move.IsZero) - { - move = moveDirection.Normalized * MoveSpeed * Time.DeltaTime / (1.0f/Time.PhysicsFPS); - wishVelocity = move; - - /*var groundVelocity = rigidBody.LinearVelocity; - groundVelocity.Y = 0f; - if (groundVelocity.Length > 320) - wishVelocity = wishVelocity.Normalized * 320;*/ - //wishVelocity = move; - } - /*else if (!wishVelocity.IsZero) - { - moveDirection = wishVelocity.Normalized; - wishVelocity -= moveDirection * groundDamping * Time.DeltaTime; - if (Vector3.Dot(wishVelocity, moveDirection) < 0) - wishVelocity = Vector3.Zero; - }*/ - //else if (!wishVelocity.IsZero) - // wishVelocity = new Vector3(0); - + bool collided; + RayCastHit[] hitInfos; + var capsuleCollider = Actor.GetChild(); + var boxCollider = Actor.GetChild(); + PhysicsColliderActor collider = null; + Vector3 delta = end - start; - Vector3 velocity = wishVelocity; + if (capsuleCollider && capsuleCollider.IsActive) + { + collider = capsuleCollider; + + //start.Y -= capsuleCollider.Height / 2; + //start.Y -= capsuleCollider.Radius / 2; + + /*collided = Physics.BoxCastAll(start, + new Vector3(capsuleCollider.Radius, + (capsuleCollider.Height + capsuleCollider.Radius) / 2, + capsuleCollider.Radius), + delta.Normalized, out hitInfos, Quaternion.Identity, delta.Length, uint.MaxValue, + false);*/ + + collided = Physics.CapsuleCastAll(start, + capsuleCollider.Radius, capsuleCollider.Height, + delta.Normalized, out hitInfos, capsuleCollider.Orientation, delta.Length, uint.MaxValue, + false); + } + else if (boxCollider && boxCollider.IsActive) + { + collider = boxCollider; - bool collided = Physics.BoxCastAll(rigidBody.Position, new Vector3(capsuleCollider.Radius, (capsuleCollider.Height + capsuleCollider.Radius) / 2, capsuleCollider.Radius), Physics.Gravity.Normalized, out RayCastHit[] hitInfos, Quaternion.Identity, Physics.Gravity.Length * Time.DeltaTime, uint.MaxValue, false); + //start.Y += boxCollider.Size.Y / 2; + + collided = Physics.BoxCastAll(start, + boxCollider.OrientedBox.Extents, + delta.Normalized, out hitInfos, boxCollider.Orientation, delta.Length, uint.MaxValue, + false); + } + else + return new RayCastHit[0]; - const float minDistanceFromFloor = 0.1f; + if (collided) + { + List hitInfosFiltered = new List(); + foreach (var hitInfo in hitInfos) + { + if (hitInfo.Collider == collider) + continue; + + hitInfosFiltered.Add(hitInfo); + } - Vector3 floorNormal = Vector3.Zero; - Vector3 floorPosition = Vector3.Zero; - float floorDistance = 0.0f; + hitInfos = hitInfosFiltered.ToArray(); + } + + return hitInfos; + } + + private bool SlideMove(Vector3 start, ref Vector3 velocity) + { + // PM_SlideMove + /* + + endpos = pos + velocity + + for i=0, i<4, i++ + trace(pos, endpos) + + if trace.dist >= 1 + break; + + blocked = + blocked_floor => trace.plane.normal[2] >= MIN_STEP_NORMAL + blocked_step => trace.plane.normal[2] == 0 + blocked_other => . + + + + */ + + + + + Vector3 startPos = start; + Vector3 endPos = startPos + (velocity * Time.DeltaTime); + Vector3 delta = endPos - startPos; + bool blocked = false; + + + RayCastHit[] hitInfos = TracePlayer(startPos, endPos); + bool collided = hitInfos.Length > 0; + + float distance = 1.0f; + + Vector3 normal = Vector3.Zero; + Vector3 point; if (collided) { collided = false; foreach (var hitInfo in hitInfos) { - if (hitInfo.Collider == capsuleCollider) - continue; - //if (hitInfo.Distance < minDistanceFromFloor) // continue; + float fraction = hitInfo.Distance / delta.Length; + collided = true; - floorNormal = hitInfo.Normal; - floorPosition = hitInfo.Point; - floorDistance = hitInfo.Distance; - //Console.Print("collided " + hitInfo.Distance.ToString()); + if (fraction <= distance) + { + normal = hitInfo.Normal; + point = hitInfo.Point; + distance = fraction; + } + break; + + //Console.Print("collided " + hitInfo.Distance.ToString()); + //break; } } + if (collided) + velocity = Vector3.ProjectOnPlane(velocity, normal); - if (!collided) - gravityVelocity += Physics.Gravity * Time.DeltaTime; - else + blocked = collided; + + return blocked; + } + + //Vector3 wishVelocity = Vector3.Zero; + Vector3 gravityVelocity = Vector3.Zero; + Vector3 currentVelocity = Vector3.Zero; + private bool onGround = false; + + private const float friction = 4f; + private const float stopspeed = 100f; + private const float accelerationGround = 10f; + private const float jumpVelocity = 270f; + private bool jumped = false; + + public override void OnFixedUpdate() + { + var rigidBody = Actor.As(); + var rootTrans = rootActor.Transform; + + var inputDirection = new Vector3(InputManager.GetAxis("Horizontal"), 0.0f, InputManager.GetAxis("Vertical")); + var moveDirection = rootTrans.TransformDirection(inputDirection); + + Vector3 wishVelocity = Vector3.Zero; + if (!Console.IsOpen && !inputDirection.IsZero) { - gravityVelocity = Vector3.Zero; - - // if (floorDistance < minDistanceFromFloor) + //move = moveDirection.Normalized * MoveSpeed * Time.DeltaTime / (1.0f/Time.PhysicsFPS); + inputDirection = moveDirection.Normalized * MoveSpeed; + wishVelocity = inputDirection; + } + + // onGround checks + RayCastHit[] hitInfosGround = TracePlayer(rigidBody.Position, rigidBody.Position + (Vector3.Down * 1f)); + onGround = false; + foreach (var hitInfo in hitInfosGround) + { + var dot = Vector3.Dot(Vector3.Down, hitInfo.Normal); + if (dot < -0.7) //~45deg { - var pos = rigidBody.Position; - pos.Y = floorPosition.Y + (capsuleCollider.Height * 0.5f + capsuleCollider.Radius) + (minDistanceFromFloor * 0.5f); - rigidBody.Position = pos; + onGround = true; + Vector3 newPos = rigidBody.Position; + newPos += Vector3.Down * (hitInfo.Distance - 0.01f); + //newPos.Y = hitInfo.Point.Y + 0.0001f; + //rigidBody.Position = newPos; + //currentVelocity.Y = 0.0f; } - - /*if (floorDistance < minDistanceFromFloor) + } + + // jump + if (onGround) + { + if (!jumped && InputManager.GetAction("Jump")) { - Console.Print("grav "); - rigidBody.Position = new Vector3(rigidBody.Position.X, (floorPosition + (floorNormal * minDistanceFromFloor*0.9f)).Y, rigidBody.Position.Z); - }*/ - //rigidBody.Position = floorPosition + (floorNormal * minDistanceFromFloor); + //jumped = true; + + currentVelocity += Vector3.Up * jumpVelocity; + } + else if (jumped) // jump released + jumped = false; + } + + + // ground friction + if (onGround) + { + float currentSpeed = currentVelocity.Length; + + float control = currentSpeed < stopspeed ? stopspeed : currentSpeed; + var drop = control * friction * Time.DeltaTime; + + float newspeed = currentSpeed - drop; + if (newspeed < 0) + newspeed = 0; + + if (currentSpeed < 0.0001f) + currentVelocity *= 0; + else + currentVelocity *= newspeed / currentSpeed; } - Vector3 newVelocity = velocity + gravityVelocity; - - if (newVelocity != rigidBody.LinearVelocity) - rigidBody.LinearVelocity = newVelocity; - - if (rigidBody.IsKinematic && !rigidBody.LinearVelocity.IsZero) - rigidBody.Position += rigidBody.LinearVelocity * Time.DeltaTime; - /* - - check gravity - - get normal for slope - - moveVelocity = wishVelocity + // ground acceleration + { + float currentSpeed = Vector3.Dot(currentVelocity, wishVelocity.Normalized); + float addSpeed = wishVelocity.Length - currentSpeed; + if (addSpeed > 0) + { + float accelSpeed = 12f * wishVelocity.Length * Time.DeltaTime; + if (accelSpeed > addSpeed) + accelSpeed = addSpeed; - LinearVelocity = moveVelocity + _jumpVelocity + _gravityVelocity - */ + currentVelocity += accelSpeed * wishVelocity.Normalized; + } + } + + + if (!onGround) + currentVelocity += Physics.Gravity * Time.DeltaTime; + + bool blocked2 = SlideMove(rigidBody.Position, ref currentVelocity); + if (currentVelocity.Length > 0.0f) + rigidBody.Position += currentVelocity * Time.DeltaTime; } public override void OnUpdate()