2014-03-27 69 views
2

這應該是一件容易的事,我已經使用了它,但我無法弄清楚爲什麼有任何例子都適合我。在鏡頭前放置一個物體

基本上,我想在我的第一人稱遊戲中放置瓷磚。我希望我想放置在地面上的物體在半空中「漂浮」,同時爲它選擇最佳位置。我可以實例化對象,使它成爲玩家相機的孩子,但我無法將其定位在相機前面的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); 
} 

UPDATE:相機是玩家(字符控制器)的子項,以及相機處於透視模式。

+0

相機是否爲其他東西?您的父對象的比例可以影響localPosition。如果物體比例很小,你的5可以變成0.05。只是在黑暗中拍攝。 – SirBraneDamuj

+0

你使用哪種類型的相機?投影還是拼寫?你也應該不需要啓動.localPosition,你應該可以把'itemObject.transform.Translate(new Vector3(0,0,5));' – PaulHickman

+0

我更新了原始帖子,提供了更多信息。我還可以補充一點,當我將StartPlacing()方法中的「位置」邏輯移動到Update()方法時,事情至少變得更平滑,但仍然不能正確定位。 – toreau

回答

2

感謝所有的有用的建議,大家好!我想出了以下代碼,它適合我的需求:

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); 
    } 

} 
3

您可以使用對象的forward vector,像這樣:

public GameObject frontObject; 
public float distance; 

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