【发布时间】:2012-03-15 14:17:36
【问题描述】:
虽然也可以使用 C#,但我使用 Unity,主要是 Java 来编写代码。
在我的游戏中,玩家控制一个球(刚体),应用了球的物理原理并与碰撞一起工作,您必须引导自己绕着一个马里奥银河系的星球。
我遇到的问题是,根据我在地球上的位置,控制系统似乎与我所按的相反。有没有办法约束控制系统,使无论行星或相机的方向如何,向上总是向前,向左总是向左等等。
I have found some documentation regarding spherical corodinate systems,但我不确定这是否是正确的选择,以及我是否会让事情变得过于复杂。
用于将球员球保持在星球上的代码:
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);
}
}
}
【问题讨论】:
-
这真的取决于你如何影响球的运动。你能提供更多细节 - 甚至是一些代码吗?怎么让球动起来?你如何确保它留在地球上?简而言之,听起来您的控件是基于绝对坐标/世界空间,而不是相对于球的局部对象空间。
-
围绕球移动宇宙,而不是围绕宇宙移动球。
-
您可能还会对this Arcball implementation感兴趣
标签: java c# coordinates game-physics