I am Quite new to unity (but know how to code) and I decided to build my own physics engine (because you can not see the code for the physix ) anyway; gravity and flat collisions work the problem is that my character going up ramp works sometimes, but at times it will begin to “sink into the terrain” as so to speak. Here’s the code for the player movement of what I have so far;
var gravity: float = 0;
var speed : int = 5;
var gravity_affect : int = 1;
var floor_detect : RaycastHit;
function Update () {
var up = transform.TransformDirection(Vector3.up);
var right = transform.TransformDirection(Vector3.right);
var forward = transform.TransformDirection(Vector3.forward);
var climb_height=0;
var distance_check=0;
//var up_left= (transform.TransformDirection(Vector3.up)-transform.TransformDirection(Vector3.right))/2 ;
if (gravity_affect==1){
transform.Translate(Vector3(0,0-gravity,0) * Time.deltaTime);
if (gravity<15)
{
gravity+=0.5;
}
}
if(Physics.Raycast((Vector3(transform.position.x-0.5,transform.position.y,transform.position.z-0.5)), -up, floor_detect,0.5+(gravity*Time.deltaTime)) || Physics.Raycast((Vector3(transform.position.x+0.5,transform.position.y,transform.position.z-0.5)), -up, floor_detect,0.5+(gravity*Time.deltaTime))||Physics.Raycast((Vector3(transform.position.x-0.5,transform.position.y,transform.position.z+0.5)), -up, floor_detect,0.5+(gravity*Time.deltaTime))||Physics.Raycast((Vector3(transform.position.x+0.5,transform.position.y,transform.position.z+0.5)), -up, floor_detect,0.5+(gravity*Time.deltaTime)) ){
if(floor_detect.collider.gameObject.name != "Platform"){
gravity_affect =1;}
else if (gravity>0){
gravity_affect=0;
gravity=0;
// transform.position.y=Mathf.Floor(transform.position.y);
}
}
else if(Physics.Raycast((Vector3(transform.position.x-0.5,transform.position.y,transform.position.z-0.5)), up, floor_detect,0.5-(gravity*Time.deltaTime)) || Physics.Raycast((Vector3(transform.position.x+0.5,transform.position.y,transform.position.z-0.5)), up, floor_detect,0.5-(gravity*Time.deltaTime))||Physics.Raycast((Vector3(transform.position.x-0.5,transform.position.y,transform.position.z+0.5)), up, floor_detect,0.5-(gravity*Time.deltaTime))||Physics.Raycast((Vector3(transform.position.x+0.5,transform.position.y,transform.position.z+0.5)), up, floor_detect,0.5-(gravity*Time.deltaTime)) ){
if(floor_detect.collider.gameObject.name != "Platform"){
gravity_affect =1;}
else if (gravity<0){
gravity_affect=1;
gravity=0;
}
}
else
{
gravity_affect =1;
}
//Up Button
if(!Input.GetButton("btn_left") Input.GetButton("btn_up") !Input.GetButton("btn_right") !Input.GetButton("btn_down")){
if (!Physics.Raycast((Vector3(transform.position.x+0.5,transform.position.y-0.5,transform.position.z+0.5)), forward, floor_detect,(speed*Time.deltaTime)) !Physics.Raycast((Vector3(transform.position.x+0.5,transform.position.y+0.5,transform.position.z+0.5)), forward, floor_detect,(speed*Time.deltaTime)) !Physics.Raycast((Vector3(transform.position.x-0.5,transform.position.y-0.5,transform.position.z+0.5)), forward, floor_detect,(speed*Time.deltaTime)) !Physics.Raycast((Vector3(transform.position.x-0.5,transform.position.y+0.5,transform.position.z+0.5)), forward, floor_detect,(speed*Time.deltaTime))) {
transform.Translate(Vector3(0,0,speed) * Time.deltaTime);}
else
{
while(distance_check*Time.deltaTime<1)
{while(Physics.Raycast((Vector3(transform.position.x-0.5+(distance_check*Time.deltaTime),transform.position.y+(-0.5)+(climb_height*Time.deltaTime),transform.position.z+0.5)), forward, floor_detect,(speed*Time.deltaTime)))
{
climb_height+=1;
}
distance_check+=1;
}
distance_check=0;
transform.Translate(Vector3(0,climb_height+1,speed) * Time.deltaTime);
climb_height=0;
}
}}
I know the code is not tidy and it has only responds to the up key, but what am I doing wrong that’s causing the cube sinking when going on ramps.