You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

155 lines
4.0 KiB

using UnityEngine;
using System.Collections;
using CharacterEngine.Controller;
namespace CharacterEngine.Primitives
{
public sealed class CEPrimitives
{
#region Controller Globals
public const int sweepResolution = 3;
private static float gravity = -8.0f;
public static float Gravity
{
get { return gravity; }
set { gravity = value; }
}
#endregion
#region Controller Variables
private CEController controller;
public readonly CECollider collider;
private Vector2 velocity;
public Vector2 Velocity
{
get { return velocity; }
}
public Transform transform
{
get { return controller.transform; }
}
#endregion
#region Initializers & Constructors
public CEPrimitives (CEController controller)
{
this.controller = controller;
collider = new CECollider(controller.GetComponent<BoxCollider2D>());
}
#endregion
#region Steps
/*Summary:
Here in steps, there are the methods called in the UPDATES, that means that every step
will be executed every frame.
*/
public void Step ()
{
PhysicsStep();
}
public void AddVelocity ( Vector2 velocity )
{
this.velocity += velocity;
}
void PhysicsStep()
{
GetVelocity();
GravityStep();
CollisionStep();
ApplyVelocity();
Move();
}
void GetVelocity()
{
}
void GravityStep()
{
velocity.y += gravity * controller.weight * Time.deltaTime * 1.2f;
velocity.x = 10.0f;
}
void CollisionStep()
{
for (int i = 0; i < 5; i++)
if (!CollideAndSlide()) break;
}
bool CollideAndSlide()
{
Vector2 oldPos = transform.position;
Vector2 predictedPos = oldPos + velocity * Time.fixedDeltaTime;
Vector2 correctedPos = predictedPos;
CECollision hit = collider.SweepTest(velocity, velocity.magnitude * Time.fixedDeltaTime);
if (hit.normal == Vector2.zero) { return false; }
Vector2 obstacleHitPoint = hit.point;
Vector2 obstacleNormal = hit.normal;
Vector2 obstacleTangent = Vector3.Cross(obstacleNormal, Vector3.forward);
if (obstacleTangent.magnitude == 0)
obstacleTangent = Vector3.Cross(obstacleNormal, Vector3.up);
Debug.DrawRay(hit.point, hit.normal);
/*
Plane obstaclePlane = new Plane(obstacleNormal, obstacleHitPoint);
Ray velRay = new Ray(oldPos, velocity);
float distanceFromPlane = 0.0f;
obstaclePlane.Raycast(velRay, out distanceFromPlane);
Vector3 vectorFromCenter = obstacleHitPoint - Coll.bounds.center ;
*/
correctedPos = predictedPos + hit.impulse;
//GameObject a = CEController.Instantiate(controller.gameObject, correctedPos, transform.rotation) as GameObject;
//a.GetComponent<CEController>().enabled = false;
Vector3 epsilon = correctedPos - predictedPos;
/*
Vector3 normalForce = Vector3.Dot(obstacleNormal, oldVel) * obstacleNormal;
newVel = oldVel - normalForce;
//newVel = (oldVel.magnitude / newVel.magnitude) * newVel;
*/
Vector3 projectedForce = Vector3.Project(velocity, obstacleTangent);
velocity = projectedForce;
return true;
}
void ApplyVelocity()
{
Debug.DrawRay(transform.position, velocity);
}
void Move()
{
transform.position += (Vector3)velocity * Time.deltaTime;
}
#endregion
}
}