今回の目標
プレイヤーオブジェクトが衝突したオブジェクトに変わるようにしたい
できなかったやつ
コード
void OnCollisionEnter(Collision collision)
{
// 触れたオブジェクトのMeshFiletrとCollider
MeshFilter otherMeshFilter = collision.gameObject.GetComponent<MeshFilter>();
Collider othercollider = collision.gameObject.GetComponent<Collider>();
string other_name = collision.gameObject.name;
// 現在のオブジェクトのMeshFilterとCollider
MeshFilter playerMeshFilter = player.GetComponent<MeshFilter>();
Collider playercollider = player.GetComponent<Collider>();
if (otherMeshFilter != null && playerMeshFilter != null && other_name != "Plane" && other_name != "Wall") // 床に触れても変更しないようにしておく
{
// プレイヤーのメッシュを触れたオブジェクトのメッシュに変更
playerMeshFilter.mesh = otherMeshFilter.mesh;
// 当たり判定も一緒に
playercollider = othercollider;
}
}
この方法だと描画される絵(多分mesh?)だけ変わってしまい、colliderは変更されなかった;;;カナシイ
なんでできなかったのか
おそらくだけど、playercollider
というプレイヤーのオブジェクトのインスタンスを書き換えただけで、物理エンジン側に反映されてない。
「ならなんでメッシュはちゃんと変わってんだよ」って話になると思うんだけど、これはMeshFilterオブジェクトの性質に原因があると思う。
ここではMeshFilter.mesh
はメッシュへの参照を保存するものなので、ここを書き換えると参照される場所が変わるのでmeshは変更できたのではないか、と個人的に考えている。
解決法
void OnCollisionEnter(Collision collision)
{
// 触れたオブジェクトのMeshFiletrとCollider
MeshFilter otherMeshFilter = collision.gameObject.GetComponent<MeshFilter>();
Collider othercollider = collision.gameObject.GetComponent<Collider>();
string other_name = collision.gameObject.name;
// 現在のオブジェクトのMeshFilterとCollider
MeshFilter playerMeshFilter = player.GetComponent<MeshFilter>();
Collider playercollider = player.GetComponent<Collider>();
if (otherMeshFilter != null && playerMeshFilter != null && other_name != "Plane" && other_name != "Wall") // 床に触れても変更しないようにしておく
{
// プレイヤーのメッシュを触れたオブジェクトのメッシュに変更
// 当たり判定も一緒に
playerMeshFilter.mesh = otherMeshFilter.mesh;
// Colliderの変更
+ Destroy(playercollider);
+ player.AddComponent(othercollider.GetType());
}
playercollider
をDestroy()で削除してplayerオブジェクトにコンポーネントを追加するようにした
最後に
まだunity触り始めて日が浅いので、間違い等あるかと思いますのでどんどん指摘ください🙇