我正在嘗試制作一個拾取系統,我認為當你在看它時,在專案周圍做一個輪廓會很酷。我面臨的問題是當您不再查看我需要禁用輪廓的物件時。我最終做了一個奇怪的解決方案,并希望得到一些幫助來改進它。
public class PlayerCamera : MonoBehaviour
{
public Transform playerBody;
public Transform cameraHolder;
public float sensitivity;
public float currentY;
void Update()
{
MoveCamera();
LookingAtObject();
}
Outline objectOutline;
void LookingAtObject()
{
if(Physics.Raycast(cameraHolder.transform.position, cameraHolder.transform.forward, out var hit, Mathf.Infinity))
{
var obj = hit.collider.gameObject;
var outline = obj.GetComponent<Outline>();
if (obj && outline)
{
objectOutline = hit.transform.GetComponent<Outline>();
if (objectOutline)
objectOutline.OutlineWidth = 7;
}
else if (objectOutline)
objectOutline.OutlineWidth = 0;
}
}
}
uj5u.com熱心網友回復:
您可以將輪廓物件存盤在變數中,并且每當您擊中不同的輪廓物件或什么都不擊中時,將輪廓設定回零。
Outline objectOutline;
void LookingAtObject()
{
if (Physics.Raycast(...))
{
var outline = hit.collider.GetComponent<Outline>();
// Make sure the hit object is not the same one we already outlined
//
if (outline != objectOutline)
{
// Remove the outline from our previously viewed object
//
if (objectOutline != null)
{
objectOutline.OutlineWidth = 0;
}
// Store the new outline object
//
objectOutline = outline;
// Since outline could be null, we need to check null before outlining
//
if (objectOutline != null)
{
objectOutline.OutlineWidth = 7;
}
}
}
// If we have an object we outlined and we didnt hit anything,
// remove the outline and reset the variable
//
else if (objectOutline != null)
{
objectOutline.OutlineWidth = 0;
objectOutline = null;
}
}
uj5u.com熱心網友回復:
您需要兩個事件來解決問題。輸入幀和光線輸出幀。此代碼通過記錄前一幀并將其與當前命中進行比較來檢測哪個raycast
事件,并相應地設定輪廓。raycastHit
private RaycastHit lastHit;
void Update()
{
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Physics.Raycast(ray, out var hit);
//Physics.Raycast(cameraHolder.transform.position, cameraHolder.transform.forward, out var hit, Mathf.Infinity);
if (hit.transform != lastHit.transform)
{
if (hit.transform) // when raycast Begin
{
var outline = hit.transform.GetComponent<Outline>();
outline.OutlineWidth = 7;
}
else if (lastHit.transform) // when raycast out
{
var outline = lastHit.transform.GetComponent<Outline>();
outline.OutlineWidth = 0;
}
}
lastHit = hit;
}
提示:我評論了您用于測驗的 raycast 代碼。如果您想像以前一樣更改光線投射代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/484713.html
標籤:unity3d
上一篇:Unity鏡像網格,但顏色朝下