预制体的创建


预制体操作



预制体变化,预制体的实例也会变化

动态创建实例

对于数量多的物体可以使用API来创建
实例初始化


实例的销毁

例子:炮塔发射子弹
cs
public class FireLogic : MonoBehaviour
{
// 对子弹 prefab 资源的引用
public GameObject bulletPrefab;
public Transform bulletFather;
public Transform firePosition;
public Transform fireAngle;
public float fireSpeed;
public float fireTime;
void Start()
{
}
void Update()
{
if(Input.GetMouseButtonDown(0))
{
TestFire();
}
}
void TestFire()
{
Debug.Log("* 创建子弹的实例 ..");
GameObject node = Object.Instantiate(bulletPrefab, bulletFather);
node.transform.position = firePosition.transform.position;
// 在你的场景中,由于子弹的父级为 null,使用 localEulerAngles 和 eulerAngles 效果相同。
// 但为了代码的清晰性和可维护性,建议使用 eulerAngles 或直接设置 rotation。
node.transform.eulerAngles = fireAngle.transform.eulerAngles;
BulletLogic bulletLogic = node.GetComponent<BulletLogic>();
bulletLogic.speed = 1;
bulletLogic.maxDistance = bulletLogic.speed * 5;
}
}
public class BulletLogic : MonoBehaviour
{
public float speed;
public float maxDistance;
void Start()
{
float flytime = 1;
if(speed > 0)
{
flytime = maxDistance / speed;
}
Invoke("SelfDestroy", flytime);
}
void Update()
{
this.transform.Translate(0, 0, speed, Space.Self);
}
private void SelfDestroy()
{
Object.Destroy(this.gameObject);
}
}
物理系统

物理碰撞

反弹和摩擦

碰撞检测


碰撞体的编辑

射线检测函数
Physics.Raycast 是 Unity 物理系统中的射线检测函数(Raycasting)。
简单来说:
它从一个点沿某个方向发射一条"看不见的射线(Ray)",检测射线是否击中了场景中的碰撞体(Collider)。
函数原型与重载
Physics.Raycast 有多个重载版本,最常用的几种如下:
基本形式
cs
bool Physics.Raycast(Vector3 origin, Vector3 direction);
作用: 从 origin 出发,沿 direction 方向发射射线,检测是否击中任何 Collider。
返回值:
cs
true → 击中物体
false → 未击中
获取命中信息
cs
bool Physics.Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo);
作用: 除了判断是否命中,还返回命中的详细信息(如命中点、法线、距离、物体等)。
RaycastHit 是一个结构体,包含:
cs
hitInfo.point // 射线击中的世界坐标
hitInfo.normal // 击中表面的法线
hitInfo.distance // 从起点到击中点的距离
hitInfo.collider // 被击中的 Collider 对象
hitInfo.transform // 被击中物体的 Transform
hitInfo.rigidbody // 被击中物体的 Rigidbody(如果有)
限制射线长度
cs
bool Physics.Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance);
作用: 仅检测从起点沿方向最多 maxDistance 长度内的碰撞。
指定层遮罩(LayerMask)
cs
bool Physics.Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask);
作用: 只检测某些层(Layer)的碰撞体。 比如只检测"Enemy"层:
cs
int enemyLayer = LayerMask.GetMask("Enemy");
Physics.Raycast(origin, direction, out hitInfo, 100f, enemyLayer);

