размещение блока с помощью raycast в unity3d - PullRequest
1 голос
/ 12 июля 2019

Я пробую игру, подобную космическим инженерам / Minecraft.с помощью этого кода я размещаю блок на стороне блока, уже размещенного с помощью raycast.Это работает хорошо, пока я не добавлю коллайдер (тогда он помещает блок где-нибудь между блоком и экраном).Помогите с кодом или другой идеей, пожалуйста.

RaycastHit hit;
int maxBuildDist = 10;
public GameObject Block;
Vector3 BlockPos;

void Update () {

if(Physics.Raycast(Camera.main.ScreenPointToRay(                                                
    new Vector3((Screen.width / 2 ),(Screen.height / 2),0)),out hit, maxBuildDist)){

        BlockPos = new Vector3(hit.normal.x,hit.normal.y,hit.normal.z);  

        Block.transform.position = (hit.transform.position + BlockPos)/2;                         
    }
}

}

1 Ответ

2 голосов
/ 12 июля 2019

Обновите ваш вызов Physics.Raycast, чтобы он попадал только по интересующим вас объектам. Ознакомьтесь с документацией Physics.Raycast о параметре layerMask, чтобы узнать, как это сделать: https://docs.unity3d.com/ScriptReference/Physics.Raycast.html

1.Создайте слой и установите на блоке prefab

. Используйте раскрывающееся меню в окне инспектора prefab:

Dropdown menu in top-right of Inspector window highlighted

2.Обновление вызова Physics.Raycast

Скажем, вы создали новый слой с именем "BlockLayer".Вы бы изменили свою Update функцию на это:

// Find the layer based on its name.
var layerId = LayerMask.NameToLayer("BlockLayer");

// Set our mask to "ignore everything except for blocks".
var layerMask = ~layerId;

// Update the Physics.Raycast call - pass in the layer mask
if(Physics.Raycast(
  Camera.main.ScreenPointToRay(new Vector3((Screen.width / 2 ),(Screen.height / 2),0)),
  out hit,
  maxBuildDist,
  layerMask))
{
    // This code will only be reached if the raycast hit a block.
    BlockPos = new Vector3(hit.normal.x,hit.normal.y,hit.normal.z);  
    Block.transform.position = (hit.transform.position + BlockPos)/2;                         
}
...