私は現在、最初の Unity プロジェクトに取り組んでおり (自己規定の短期集中コースのようなものです)、わずかな問題に遭遇しました。
あるオブジェクトを別のオブジェクトから逸らそうとしています(衝突によって)。今のところ、たわみは完全にミラーリングされた角度になっているはずです。問題ない!私は自分自身に、この非常に便利なcontact.normal
プロパティを見ていると思います。かなり簡単に思えます(私は2D平面で作業しているので、そこからは順風満帆だったはずです)。
何度かイライラして失敗し、数千のdrawRay
コマンドを実行した後、法線は衝撃面の法線ではなく、衝撃の法線であることに気付きました (つまり、衝撃の角度を反映しています)。
これは実際には有用な情報ですが、有用であるためには、衝突の角度を反映する面の法線が必要です。
動くオブジェクトが使用してthis.rigidbody.velocity =
いるため、組み込みの物理演算に頼ることはできません。私はまた、この跳ね返りがどのように見えるかについて完全に固執しているので、それを完全に制御し続けたいと思っています.
以下の関連コード:
function OnCollisionEnter(collision : Collision)
{
var contactCount : int = 0;
var normalAve : Vector3 = Vector3(0,0,0);
var velocityAve : Vector3 = Vector3.zero;
for (var contact : ContactPoint in collision.contacts)
{
contactCount++;
normalAve += contact.normal;
velocityAve += collision.relativeVelocity;
Debug.DrawRay(contact.point, contact.normal, Color.green, 2, false);
}
normalAve /= contactCount;
velocityAve /= contactCount;
var damage = Vector3.Dot(normalAve, velocityAve) * collision.rigidbody.mass;
life -= damage;
if(life <= 0)
{
// Stackoverflow people can ignore this, bounces
// don't happen when you're dead
this.rigidbody.useGravity = this.GetComponent(ship_small_physics).stage.GetComponent(stage_params).grav_on_hit;
this.GetComponent(ship_small_physics).impact();
}else{
// Stackoverflow people! Right here!
Debug.Log("survived! with " + life + " life");
this.GetComponent(ship_small_physics).small_impact(normalAve, velocityAve);
}
}
次に、.small_impact
function small_impact(n : Vector3, v : Vector3)
{
var h_angle : Vector3 = Vector3(n.x, 0, n.z);
Debug.DrawRay(this.transform.position, n, Color.blue, 2, false);
Debug.DrawRay(this.transform.position, h_angle, Color.red, 2, false);
}
明確にするために: ゲームはある種の 3D ですが、さまざまな理由から、この場合はx-z
平面の衝突法線しか気にしません (平面の古い物理エンジンが機能しないもう 1 つの理由)。そのため、本質的に衝突法線の平面h_angle
への投影である新しいベクトルを作成します。x-z