从不相交的光线投射实例化

Instantiate from raycast without intersect

所以我想知道如何在Unity3D中实例化一个没有交集的GameObject。到目前为止,球体实例化与我用光线投射击中的对象相交。我正在使用 hit.point 的位置,但想知道是否有办法在碰撞而不是对象的原点上生成它。这是我的代码供参考:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallSpawn : MonoBehaviour
{
    public int castLength = 100;
    public GameObject spawnObject;
    
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        //Input.GetMouseButton for infinite
        if (Input.GetMouseButton(0))
        {
            SpawnBall();
        }
            

    }

    public void SpawnBall()
    {
        RaycastHit hit;
        
        Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * castLength, Color.green, Mathf.Infinity);
        if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hit, castLength))
        {
            Instantiate(spawnObject, hit.point, hit.transform.rotation);
        }
    }
}

截至目前,球体会卡入地面并在生成时弹开。可以这么说,我希望球体被“放置”,以便它们在不剪裁的情况下生成。

你可以试试把hit.point换成hit.point + hit.normal * ballRadius(当然你必须知道或者能够得到球的半径是多少)。但这会导致一些重生位置被关闭,特别是当你以小角度撞击表面时。

更好的选择是用 Physics.SphereCast (transform.position, sphereRadius, transform.forward, out hit, castDistance) 替换光线投射。这应该会给你很好的结果,但你仍然需要像光线投射一样沿着命中法线添加球半径。