Controlling Collisions of Rotated Parent's child-object
I'm making a first-person game in a hollow-sphere world and moving the player around by making it the child of an object in the center of the world which I then rotate. There are objects inside the sphere that I don't want the player to walk through.
Attaching colliders and rigid bodies causes the player, upon collision with said objects, to become dislocated from the parent and roll off in whatever direction is dictated by collision physics. I would seem to instead need a Trigger instead of a Collider here, but I'm unsure of what directions to feed OnCollisionEnter in order to preserve the player's movement outside of the Trigger, while not allowing it to go further into the Trigger.
So what I need is a way to make sure that the following criteria are fulfilled:
Parent center-piece and child player-object always remain in their original relation to one another.
Collision of the child with another object prevents rotation of the parent object in the direction of said other object.
If it's of any help, below is the player script, which is attached to the parent object in the center of the sphere-world.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
public class PlayerController2 : MonoBehaviour
{
public float XSensitivity = 2f;
public float YSensitivity = 2f;
public bool clampVerticalRotation = true;
public float MinimumX = -90F;
public float MaximumX = 90F;
public float speed = 1;
public bool smooth;
public float smoothTime = 5f;
public bool lockCursor = true;
public bool playerMovement = false;
private Quaternion m_PlayerTargetRot;
private Quaternion m_CameraTargetRot;
private bool m_cursorIsLocked = true;
private Transform player;
public Transform cam;
// Use this for initialization
void Awake()
{
player = GetComponent<Transform>();
m_PlayerTargetRot = player.localRotation;
m_CameraTargetRot = cam.localRotation;
}
// Update is called once per frame
void Update()
{
float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * YSensitivity; //mouselook, lookrotation()
float yRot = CrossPlatformInputManager.GetAxis("Mouse X") * XSensitivity;
if (playerMovement)
{
Vector2 input = new Vector2
{
x = CrossPlatformInputManager.GetAxis("Horizontal") * speed,
y = CrossPlatformInputManager.GetAxis("Vertical") * speed
};
m_PlayerTargetRot *= Quaternion.Euler(-input.y, yRot, input.x);
}
else
m_PlayerTargetRot *= Quaternion.Euler(0f, yRot, 0f);
m_CameraTargetRot *= Quaternion.Euler(-xRot, 0.0f, 0.0f);
if (clampVerticalRotation)
m_CameraTargetRot = ClampRotationAroundXAxis(m_CameraTargetRot);
cam.localRotation = Quaternion.Slerp(cam.localRotation, m_CameraTargetRot, smoothTime * Time.deltaTime);
player.localRotation = Quaternion.Slerp(player.localRotation, m_PlayerTargetRot, smoothTime * Time.deltaTime);
UpdateCursorLock();
}
public void SetCursorLock(bool value)
{
lockCursor = value;
if (!lockCursor)
{//we force unlock the cursor if the user disable the cursor locking helper
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
}
public void UpdateCursorLock()
{
//if the user set "lockCursor" we check & properly lock the cursos
if (lockCursor)
InternalLockUpdate();
}
private void InternalLockUpdate()
{
if (Input.GetKeyUp(KeyCode.Escape))
{
m_cursorIsLocked = false;
}
else if (Input.GetMouseButtonUp(0))
{
m_cursorIsLocked = true;
}
if (m_cursorIsLocked)
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
else if (!m_cursorIsLocked)
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
}
Quaternion ClampRotationAroundXAxis(Quaternion q) //I haven't dissected this yet, but it works... (taken from Unity's "MouseLook.cs") like much of the above.
{
q.x /= q.w;
q.y /= q.w;
q.z /= q.w;
q.w = 1.0f;
float angleX = 2.0f * Mathf.Rad2Deg * Mathf.Atan(q.x);
angleX = Mathf.Clamp(angleX, MinimumX, MaximumX);
q.x = Mathf.Tan(0.5f * Mathf.Deg2Rad * angleX);
return q;
}
}
Your answer
Follow this Question
Related Questions
On keydown, moving the player to position of an empty game object with specific tag 0 Answers
Collision is not working with some Collider2d 1 Answer
How can I detect the collision of a gameObject which is at a high speed? 1 Answer
OnTriggerEnter getting called more than once 0 Answers
When two different 3d objects touch each other I want one of them to turn green, how do I do this? 0 Answers