【Unity】アイテムを回転させて特定の面が正面に来たら色を変える

投稿者: | 2020-04-26


一人称視点のホラーゲームなどで、アイテムを掴んだ後に回転させるような動きがよくありますが、アイテムを回転させて、特定の面がカメラの正面に来た時にその面の色を変えてみました。
アイテムにヒントが隠されているような時に応用できるかもしれません。

まずBlenderでCubeの一つの面だけに別のマテリアルを適用しました。

Unityにもってくると、メッシュレンダラーにマテリアルが2つ付いています。

Element 1のマテリアルの色を変更してシーンビューで確認すると、この面はtransform.rightの反対側にありました。

前の記事の方法で、内積からこの方向とカメラへの方向のなす角のコサインを求めて、この面がカメラに向いているかどうかを判断します。


float dot = Vector3.Dot(-item.transform.right, (cam.position - item.transform.position).normalized);

if (dot > 0.85f)
{
    materials[1] = mat2;
    itemMeshRenderer.materials = materials; // この面を赤色に変える
}

アイテムを回転させる

マウスの右クリックと左クリックの間にあるホイールを押し込みながらマウスをドラッグするとCubeが回転するようにします。
このボタンはデフォルトでは使えなかったので、Project Settings -> Input に新しく設定しました。


Sizeを増やすと新規追加できます。


Positive Buttonに「mouse 2」と入力します。スクリプトではNameに入れる文字列を使います。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

public class ItemScript2 : MonoBehaviour
{
    [SerializeField] float turnSpeed = 3f;
    [SerializeField] GameObject item;
    [SerializeField] Material mat1;
    [SerializeField] Material mat2;

    float turnAmount_x;
    float turnAmount_y;
    Transform cam;
    MeshRenderer itemMeshRenderer;
    bool frag = false;
    Material[] materials;


    // Start is called before the first frame update
    void Start()
    {
        cam = Camera.main.transform;
        itemMeshRenderer = item.GetComponent<MeshRenderer>();
        materials = new Material[2];
        materials[0] = mat1;
        materials[1] = mat1;
    }

    // Update is called once per frame
    void Update()
    {
        if (CrossPlatformInputManager.GetButtonDown("Fire2"))
        {
            turnAmount_x = 0f;
            turnAmount_y = 0f;
        }

        if (CrossPlatformInputManager.GetButton("mouse 2"))
        {
            var x = CrossPlatformInputManager.GetAxis("Mouse X");
            var y = CrossPlatformInputManager.GetAxis("Mouse Y");

            turnAmount_x -= x;
            turnAmount_y += y;

            item.transform.localRotation = Quaternion.Euler(turnAmount_y * turnSpeed, turnAmount_x * turnSpeed, 0f);
        }
       

        float dot = Vector3.Dot(-item.transform.right, (cam.position - item.transform.position).normalized);

        if (dot > 0.85f)
        {
            materials[1] = mat2;

            itemMeshRenderer.materials = materials;
            frag = true;
        }
        else
        {
            if (frag)
            {
                materials[1] = mat1;
                itemMeshRenderer.materials = materials;
                frag = false;
            }
        }        

    }
}
マウスを横に動かすとその分Y軸に、縦に動かすとX軸に沿って回転させてみましたが、これだとCubeの向きによって回転する方向が変わって操作しにくいです。transform.rotationに代入しても別の問題があります。改善が必要です。

コメントを残す

メールアドレスが公開されることはありません。