一人称で掴んだオブジェクトを目の前に持ってきて、マウスドラッグで回転させてみました。
スタンダードアセットのFPSコントローラーのカメラにスクリプトを付けます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
using UnityEngine.UI;
public class ItemScript3 : MonoBehaviour
{
[SerializeField] float turnSpeed = 3f; // アイテムを回転させる速さ
[SerializeField] GameObject item; // アイテム
[SerializeField] GameObject image; // 手のマーク
[SerializeField] float d = 1f; // 持ったアイテムのカメラからの距離
[SerializeField] float armLength = 2f; // レイの長さ
RaycastHit hit;
Vector3 itemPos; // アイテムのデフォルトの位置
Quaternion itemRot; // アイテムのデフォルトの回転
bool hold = false; // アイテムを持ち上げているかどうか
UnityStandardAssets.Characters.FirstPerson1.FirstPersonController1 sc_camera;
// Start is called before the first frame update
void Start()
{
sc_camera = transform.parent.GetComponent();
}
// Update is called once per frame
void Update()
{
// アイテムを持ち上げている時
if (hold)
{
// ドラッグでアイテムを回転
if (CrossPlatformInputManager.GetButton("Fire1"))
{
var x = CrossPlatformInputManager.GetAxis("Mouse X");
var y = CrossPlatformInputManager.GetAxis("Mouse Y");
item.transform.localRotation *= Quaternion.Euler(item.transform.InverseTransformDirection(transform.up) * x * -turnSpeed);
item.transform.localRotation *= Quaternion.Euler(item.transform.InverseTransformDirection(transform.right) * y * turnSpeed);
}
// Eキーでアイテムを置く
if (Input.GetKeyDown(KeyCode.E))
{
// デフォルトの位置・回転に戻す
item.transform.position = itemPos;
item.transform.rotation = itemRot;
hold = false;
sc_camera.LockCamera(false); // カメラのロックを解除
}
}
// アイテムを持ち上げていない時
else
{
if (Physics.Raycast(transform.position, transform.forward, out hit, armLength))
{
if (hit.collider.tag == "Item")
{
image.SetActive(true); // 手のマークを出す
// Eキーでアイテムを持ち上げる
if (Input.GetKeyDown(KeyCode.E))
{
item = hit.collider.gameObject;
// アイテムの位置と回転を保存
itemPos = item.transform.position;
itemRot = item.transform.rotation;
// 目の前にアイテムを移動
Vector3 itemNewPos = transform.position + transform.forward * d;
item.transform.position = itemNewPos;
hold = true; // アイテムを持ち上げる
image.SetActive(false); // 手のマークを消す
sc_camera.LockCamera(true); // カメラをロック
}
}
else
{
image.SetActive(false);
}
}
else
{
image.SetActive(false);
}
}
}
}
アイテムを持ち上げていない時は視線の方向に短いレイを飛ばします。「Item」タグの付いたオブジェクトにレイが当たると、手の画像を表示させます。
アイテムのオブジェクトには「Item」タグを付けて、コライダーも追加します。ピボットは重心のあたりに置かれている方が綺麗に回転すると思います。
アイテムにレイがあたっているときにEキーを押すと、アイテムを置く時のためにその時のアイテムの位置と回転を保存してから、アイテムをプレイヤーの目の前に移動します。
移動先の位置は、カメラのtransform.forwardを伸縮させたもののワールド座標です。
アイテムを掴んでいる間は、視線を動かしたりプレイヤーを移動させたりできないように、FirstPersonControllerにカメラを固定するメソッドを追加しています。
アイテムの回転は前の記事の方法を使っています。アイテムが回転する軸をカメラの上や右方向にしているので、常にカメラからみて同じ軸に沿って回転します。
アイテムを持っているときにEキーを押すと、アイテムの位置と回転を元に戻してアイテムを置きます。
// Eキーでアイテムを置く
if (Input.GetKeyDown(KeyCode.E))
{
// デフォルトの位置・回転に戻す
item.transform.position = itemPos;
item.transform.rotation = itemRot;
hold = false;
sc_camera.LockCamera(false); // カメラのロックを解除
}