Я использую Unity и в основном Java для кода, хотя C # также может быть использован.
В моей игре игрок управляет шаром (твердым телом), применяя физику мяча и работая в полной мере с столкновениями, и вы должны вести себя вокруг планеты Марио Галактики.
Проблема, с которой я столкнулся, заключается в том, что система управления, кажется, делает противоположное тому, что я нажимаю, в зависимости от того, где я нахожусь на планете. Есть ли способ ограничить систему управления, чтобы независимо от ориентации планеты или камеры вверх всегда был вперед, слева всегда оставался и т. Д.
Я нашел некоторую документацию по сферическим системам кородината , но не уверен, что это будет путь, и если я буду слишком усложнять вопрос.
Код, используемый для удержания мяча игрока на планете:
FauxGravityAttractor.js
// Set to true for mono-directional gravity
var useLocalUpVector : boolean = false;
// Force applied along gravity up-vector (negative = down)
var fauxGravity = -10.0;
function Attract ( body : FauxGravityBody ){
var gravityUp : Vector3;
var localUp: Vector3;
var localForward : Vector3;
var t : Transform = body.transform;
var r : Rigidbody = body.rigidbody;
// Figure out the body's up vector
if(useLocalUpVector){
gravityUp = transform.up;
} else {
gravityUp = t.position - transform.position;
gravityUp.Normalize();
}
// Accelerate the body along its up vector
r.AddForce( gravityUp * fauxGravity * r.mass );
r.drag = body.grounded ? 1 : 0.1;
// If the object's freezerotation is set, we force the object upright
if(r.freezeRotation){
// Orient relatived to gravity
localUp = t.up;
var q = Quaternion.FromToRotation(localUp, gravityUp);
q = q * t.rotation;
t.rotation = Quaternion.Slerp(t.rotation, q, 0.1);
localForward = t.forward;
}
}
И сценарий движения мяча:
using UnityEngine;
using System.Collections;
public class MarbleControl : MonoBehaviour {
public float movementSpeed = 6.0f;
void Update () {
Vector3 movement = (Input.GetAxis("Horizontal") * Vector3.left * movementSpeed) + (Input.GetAxis("Vertical") * -Vector3.forward *movementSpeed);
rigidbody.AddForce(movement, ForceMode.Force);
}
void OnTriggerEnter (Collider other ) {
if (other.tag == "Pickup")
{
MarbleGameManager.SP.FoundGem();
Destroy(other.gameObject);
}
}
}