/// <summary> /// ici effectue un simple jump /// </summary> private void SimpleJump() { //get la collision CollisionSimple collisionJump = worldCollision.GetSimpleCollisionSafe(); switch (collisionJump) { case CollisionSimple.Ceilling: Debug.Log("jumpFromCeilling"); JumpFromCeilling(); break; case CollisionSimple.Ground: Debug.Log("jumpFromGround"); JumpFromGround(); break; case CollisionSimple.Wall: if (worldCollision.IsOnCoinGround()) { Jump(Vector3.up); break; } JumpFromWall(); break; default: Debug.Log("alors la je sais pas..."); break; } }
/// <summary> /// s'il y a plusieurs normal dans le tableau... si on est dans un coin, prendre toujours le wallJump /// (sauf si c'est un player !) /// </summary> private Vector3 DefineWhichNormalToChose() { bool floor = false; bool wall = false; Vector3 wallTmp = Vector3.zero; int numberNormals = 0; for (int i = 0; i < colliderNormalArray.Length; i++) { if (colliderNormalArray[i] != Vector3.zero) { //int collisionSimple = WhatKindOfNormalIsIt(colliderNormalArray[i]); CollisionSimple collisionSimple = WhatKindOfNormalItIs(colliderNormalArray[i]); //Debug.Log("ici: normal:" + colliderNormalArray[i] + ", collision : " + collisionSimple); switch (collisionSimple) { case CollisionSimple.Ground: floor = true; break; case CollisionSimple.Wall: if (objectInCollision[i] != null && GameData.IsInList(listLayerExceptionGrounded, objectInCollision[i].layer)) { //Debug.Log("ici on est sur un player..."); break; } wall = true; wallTmp = colliderNormalArray[i]; break; case CollisionSimple.Ceilling: //Debug.Log("ceilling"); break; case CollisionSimple.InAir: default: break; } numberNormals++; } } if (floor && wall) { //Debug.Log("on est un wall"); isOnCoinGround = true; return(wallTmp); } isOnCoinGround = false; if (numberNormals == 0) { //Debug.Log("i ln'y a aucune normal"); return(Vector3.zero); } //Debug.Log("retourne juste la some des normals actuells: " + normalSumCollide); return(normalSumCollide); }
public EntityStack(int id, int count) { this.Id = id; this.count = count; AABB = new AxisAlignedBoundingBox(new Vector3(-0.25f, -0.25f, -0.25f), new Vector3(0.25f, 0.25f, 0.25f)); collisionSystem = new CollisionSimple(this); EntityType = EntityTypeEnum.EntityStackFullUpdate; }
/// <summary> /// ici grounded sur sol only ! /// </summary> /// <returns></returns> public bool AreBothGroundedOn(CollisionSimple onFloor) { if (worldCollision[0].GetSimpleCollisionSafe() == onFloor && worldCollision[1].GetSimpleCollisionSafe() == onFloor) { return(true); } return(false); }
/// <summary> /// est-il sur le sol ? /// </summary> /// <returns></returns> public bool IsOnFloor() { CollisionSimple tmpCollision = GetSimpleCollisionSafe(); if (tmpCollision == CollisionSimple.Ground) { return(true); } return(false); }
/// <summary> /// déplace horizontalement le player /// </summary> private void MoveHorizOnGround(Vector3 velocityChange) { if (playerPenduleMove.IsAirTenseOrInCoolDown()) { return; } Vector3 targetVelocity = velocityChange; //si on est en collision avec wall, ou ceilling, gérer ça à part if (!CheckCollisionType(velocityChange)) { return; } //si il n'y a pas d'input, gérer la décélération ?? if (velocityChange.x == 0) { DoSlowDownWhenNoInput(); //animController.NotMoving(); return; } //animController.IsMoving(playerInput.Horiz); previousInput = velocityChange.x; //TODO: rotate, ou remplacer velocityChange par le right/left de la normal de collision... //TODO; Vector3 dirNormal = worldCollision.GetSumNormalSafe(); Vector3 dirReference = velocityChange; if (dirNormal != Vector3.zero && dirReference != Vector3.zero) { Vector3 dir = QuaternionExt.GetTheGoodRightAngleClosest(dirNormal, dirReference, 10f); Vector3 direction = dir.normalized; float speed = velocityChange.magnitude; velocityChange = direction * speed; Vector3 normalRight = QuaternionExt.CrossProduct(velocityChange, Vector3.forward); CollisionSimple rightNormal = worldCollision.WhatKindOfNormalItIs(normalRight); Vector3 normalLeft = -QuaternionExt.CrossProduct(velocityChange, Vector3.forward); CollisionSimple leftNormal = worldCollision.WhatKindOfNormalItIs(normalLeft); /*Vector3 newDir = (rightNormal == CollisionSimple.Ground) ? normalRight : normalLeft;*/ if (rightNormal == CollisionSimple.Ground || leftNormal == CollisionSimple.Ground) { if (worldCollision.IsOnCoinGround()) { //ChooseIfAccelerateOrVelocityChange(velocityChange, ratioForceInCoin); CoinCase(velocityChange); } else { float angle = QuaternionExt.GetAngleFromVector(direction); //Debug.Log("angleDirection: " + angle); if (QuaternionExt.IsAngleCloseToOtherByAmount(90, angle, angleNotAcceptedForOrientedMoveFrom90)) { //Debug.Log("ici pas de force orienté par la normal"); //Debug.DrawRay(transform.position, dirReference, Color.green, 1f); ChooseIfAccelerateOrVelocityChange(dirReference, ratioForceInBadAngle); return; } if (worldCollision.GetSimpleCollisionSafe() == CollisionSimple.Wall) { ChooseIfAccelerateOrVelocityChange(velocityChange, ratioOnWall); } else { ChooseIfAccelerateOrVelocityChange(velocityChange, 1); } //rb.AddForce(velocityChange, ForceMode.VelocityChange); //Debug.DrawRay(transform.position, velocityChange, Color.green, 1f); } } } }