1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Unity] 3Dゲームでスクリプトからプレイヤーの形を変更したい

Last updated at Posted at 2024-09-14

今回の目標

画面録画-2024-09-14-202212.gif

プレイヤーオブジェクトが衝突したオブジェクトに変わるようにしたい

できなかったやつ

コード

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は変更されなかった;;;カナシイ

画面録画-2024-09-14-213035.gif

なんでできなかったのか

おそらくだけど、playercolliderというプレイヤーのオブジェクトのインスタンスを書き換えただけで、物理エンジン側に反映されてない。

「ならなんでメッシュはちゃんと変わってんだよ」って話になると思うんだけど、これはMeshFilterオブジェクトの性質に原因があると思う。

MeshFilter - unityマニュアル

ここでは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触り始めて日が浅いので、間違い等あるかと思いますのでどんどん指摘ください🙇

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?