- Home /
Player Instantiate rotaion problem
Hi, Im making a new 2.5D platformer game. When I spawn the player at the start of the game, He is rotated -90 Degrees on the Y axis but he still moves on the X axis. When I try to rotate him on spawn with this line of code:
cam.SetTarget((Instantiate(player,Vector3.zero,Quaternion.Euler(0,90,0)as GameObject).transform)
He rotates but then he moves on the Z axis. So, I want to know how I can rotate him and still have him move on the X Axis.
Heres the Scripts (C#)
PlayerController.cs (Controls) using UnityEngine; using System.Collections;
[RequireComponent(typeof(PlayerPhysics))]
public class PlayerController : MonoBehaviour {
// Player Handling
public float gravity = 20;
public float runSpeed = 50;
public float acceleration = 30;
public float jumpHeight = 12;
private float currentSpeed;
private float targetSpeed;
private Vector2 amountToMove;
private PlayerPhysics playerPhysics;
private Animator animator;
void Start ()
{
playerPhysics = GetComponent<PlayerPhysics>();
animator = GetComponent<Animator>();
}
void Update ()
{
if (playerPhysics.movementStopped)
{
targetSpeed = 0;
currentSpeed = 0;
}
animator.SetFloat("Speed", currentSpeed);
//Input
targetSpeed = Input.GetAxisRaw("Horizontal") * runSpeed;
currentSpeed = IncrementTowards(currentSpeed, targetSpeed,acceleration);
if (playerPhysics.grounded)
{
amountToMove.y = 0;
// Jump
if (Input.GetButtonDown("Jump"))
{
amountToMove.y = jumpHeight;
}
}
amountToMove.x = currentSpeed;
amountToMove.y -= gravity * Time.deltaTime;
playerPhysics.Move(amountToMove * Time.deltaTime);
}
// Increase n towards target by speed
private float IncrementTowards(float n, float target, float a)
{
if (n == target)
{
return n;
}
else
{
float dir = Mathf.Sign(target - n); // must n be increased or decreased to get closer to target
n += a * Time.deltaTime * dir;
return (dir == Mathf.Sign(target-n))? n: target; // if n has now passed target then
//return target, otherwise return n
}
}
}
PlayerPhysics.cs (Physics and RayCasting)
using UnityEngine;
using System.Collections;
[RequireComponent (typeof(BoxCollider))]
public class PlayerPhysics : MonoBehaviour {
public LayerMask collisionMask;
private BoxCollider collider;
private Vector3 s;
private Vector3 c;
private Vector3 originalSize;
private Vector3 originalCentre;
private float colliderScale;
private int collisionDivisionsX = 3;
private int collisionDivisionsY = 10;
private float skin = .005f;
[HideInInspector]
public bool grounded;
[HideInInspector]
public bool movementStopped;
Ray ray;
RaycastHit hit;
void Start()
{
collider = GetComponent<BoxCollider>();
colliderScale = transform.localScale.x;
originalSize = collider.size;
originalCentre = collider.center;
SetCollider(originalSize,originalCentre);
}
public void Move(Vector2 moveAmount)
{
float deltaY = moveAmount.y;
float deltaX = moveAmount.x;
Vector2 p = transform.position;
// Check collisions above and below
grounded = false;
for (int i = 0; i<collisionDivisionsX; i ++)
{
float dir = Mathf.Sign(deltaY);
float x = (p.x + c.x - s.x/2) + s.x/(collisionDivisionsX - 1) * i; // Left, centre and then rightmost point of collider
float y = p.y + c.y + s.y/2 * dir; // Bottom of collider
ray = new Ray(new Vector2(x,y), new Vector2(0,dir));
Debug.DrawRay(ray.origin,ray.direction);
Debug.DrawRay(ray.origin,ray.direction);
if (Physics.Raycast(ray,out hit,Mathf.Abs(deltaY) + skin,collisionMask))
{
// Get Distance between player and ground
float dst = Vector3.Distance (ray.origin, hit.point);
// Stop player's downwards movement after coming within skin width of a collider
if (dst > skin)
{
deltaY = dst * dir - skin * dir;
}
else
{
deltaY = 0;
}
grounded = true;
break;
}
}
// Check collisions left and right
movementStopped = false;
for (int i = 0; i<collisionDivisionsY; i ++)
{
float dir = Mathf.Sign(deltaX);
float x = p.x + c.x + s.x/2 * dir;
float y = p.y + c.y - s.y/2 + s.y/(collisionDivisionsY - 1) * i;
ray = new Ray(new Vector2(x,y), new Vector2(dir,0));
Debug.DrawRay(ray.origin,ray.direction);
Debug.DrawRay(ray.origin,ray.direction);
if (Physics.Raycast(ray,out hit,Mathf.Abs(deltaX) + skin,collisionMask))
{
// Get Distance between player and ground
float dst = Vector3.Distance (ray.origin, hit.point);
// Stop player's downwards movement after coming within skin width of a collider
if (dst > skin)
{
deltaX = dst * dir - skin * dir;
}
else
{
deltaX = 0;
}
movementStopped = true;
break;
}
}
if(!grounded && !movementStopped)
{
Vector3 playerDir = new Vector3 (deltaX, deltaY);
Vector3 o = new Vector3(p.x + c.x + s.x/2 * Mathf.Sign(deltaX),p.y + c.y + s.y/2 * Mathf.Sign(deltaY));
Debug.DrawRay(o,playerDir.normalized);
ray = new Ray(o,playerDir.normalized);
if(Physics.Raycast (ray, Mathf.Sqrt (deltaX * deltaX + deltaY * deltaY), collisionMask))
{
grounded = true;
deltaY = 0;
}
}
Vector2 finalTransform = new Vector2(deltaX,deltaY);
transform.Translate(finalTransform);
}
public void SetCollider(Vector3 size, Vector3 center)
{
collider.size = size;
collider.center = center;
s = size * colliderScale;
c = center * colliderScale;
}
}
GameManager.cs (Spawning, Checkpoints & Misc) using UnityEngine; using System.Collections;
public class GameManager : MonoBehaviour {
public GameObject player;
private GameCamera cam;
// Use this for initialization
void Start ()
{
cam = GetComponent<GameCamera>();
//SpawnPlayer();
}
private void SpawnPlayer()
{
cam.SetTarget((Instantiate(player,Vector3.zero,Quaternion.Euler(0,90,0)as GameObject).transform);
}
}
GameCamera.cs (Camera Following) using UnityEngine; using System.Collections;
public class GameManager : MonoBehaviour {
public GameObject player;
private GameCamera cam;
// Use this for initialization
void Start ()
{
cam = GetComponent<GameCamera>();
//SpawnPlayer();
}
private void SpawnPlayer()
{
cam.SetTarget((Instantiate(player,Vector3.zero,Quaternion.Euler(0,90,0)as GameObject).transform);
}
}
Here are some Screenshots:
Is there a problem with your screenshots? I can't see them.
Your answer
Follow this Question
Related Questions
Trouble rotating/turning on sloped surfaces 1 Answer
need help with roation 2 Answers
How to make my new Instances spawn in the right direction? 1 Answer
2D enemy movement to target 1 Answer