web-dev-qa-db-ja.com

カメラの前にオブジェクトを配置する

これは簡単な作業であるはずです、そして私はそれをグーグルで検索しました、しかし私は例のどれかが私のために働いている理由を理解することができません。

基本的に、一人称ゲームでは地面にタイルを置きたいです。地面に置きたいオブジェクトを空中に浮かせて、最適な場所を選びたいです。オブジェクトをインスタンス化してプレーヤーカメラの子にすることはできますが、カメラの前にXユニット配置することはできません。それは常にプレイヤーの「オン」になります。

public void StartPlacing ( Item item ) {
    Object itemPrefab = Resources.Load( "Prefabs/" + item.prefabName );

    GameObject itemObject = (GameObject)Instantiate( itemPrefab );
    itemObject.transform.parent = playerCamera.transform;

    // What to do here to place it in front of the camera? I've tried this:
    itemObject.localPosition = new Vector3( 0, 0, 5 );
}

PDATE:カメラはプレイヤー(キャラクターコントローラー)の子であり、カメラは遠近法モードです。

11
toreau

皆さん、有益な提案をありがとう!私は自分のニーズに合った次のコードを思いついた:

using UnityEngine;
using System.Collections;

public class ConstructionController : MonoBehaviour {

    private Camera playerCamera;
    private GameObject itemObject;
    private float distance = 3.0f;

    // Use this for initialization
    void Start () {
        playerCamera = GetComponentInChildren<Camera>();
    }

    // Update is called once per frame
    void Update () {

        if ( itemObject != null ) {
            itemObject.transform.position = playerCamera.transform.position + playerCamera.transform.forward * distance;
            itemObject.transform.rotation = new Quaternion( 0.0f, playerCamera.transform.rotation.y, 0.0f, playerCamera.transform.rotation.w );
        }

    }

    // Start constructing an item
    public void StartConstructingItem ( Item item ) {
        Object itemPrefab = Resources.Load( "Prefabs/" + item.prefabName );

        itemObject = (GameObject)Instantiate( itemPrefab );
    }

}
5
toreau

次のように、オブジェクトの フォワードベクトル を使用できます。

public GameObject frontObject;
public float distance;

void Update () {
    frontObject.transform.position = Camera.main.transform.position + Camera.main.transform.forward * distance;
}
17
jparimaa