从不相交的光线投射实例化
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)
替换光线投射。这应该会给你很好的结果,但你仍然需要像光线投射一样沿着命中法线添加球半径。
所以我想知道如何在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)
替换光线投射。这应该会给你很好的结果,但你仍然需要像光线投射一样沿着命中法线添加球半径。