碰撞器、相机脚本与射击脚本

碰撞体概念
碰撞体 (Collider) 组件定义对象的形状以便用于物理碰撞。碰撞体是不可见的,其形状不需要与对象的网格完全相同,事实上,粗略近似方法通常更有效,在游戏运行过程中难以察觉。

碰撞与触发
本质区别:碰撞体组件是否勾选Is Trigger属性:

也就是两个都不勾选Is Trigger属性的碰撞体距离较近时(生活中的接触,挨着),那么此时两个物体将会发生碰撞。举例:球掉到地上,会被弹起来,这就是两个碰撞体进行了碰撞体产生了相互作用力,在Unity中也是这样的,两个向装的物体会产生相互作用力,而分开
若有一个勾选了Is Trigger属性,那么此时两个物体将不会产生碰撞,常见的穿模。举例:绝地求生游戏中的汽车撞到小树会直接过去,像没有这棵树一样。

代码触发条件
Unity 为我们提供了检测触发和碰撞的代码,他们分别是:

触发信息检测:

OnTriggerEnter(Collider other) 当进入触发器
OnTriggerExit(Collider other) 当退出触发器
OnTriggerStay(Collider other) 当逗留触发器


碰撞信息检测:

OnCollisionEnter(Collision collisionInfo) 当进入碰撞器
OnCollisionExit(Collision collisionInfo) 当退出碰撞器
OnCollisionStay(Collision collisionInfo) 当逗留碰撞器



以上六个函数,还有与其一一对应的2D碰撞体函数,在函数名后加上2D,则可监听2D碰撞体触发。
碰撞函数自动执行条件:

两个物体都有Collider
至少有一个物体身上挂载Rigidbody
两个物体都没有勾选Is Trigger

触发函数自动执行条件:

两个物体都有Collider
至少有一个物体身上挂载Rigidbody
至少有一个Is Trigger

代码示例:
public class ColliderTest : MonoBehaviour 
{
 
    // --------------碰撞器--------------
    private void OnCollisionEnter(Collision collision)
    {   
       Debug.Log("碰撞器 OnCollisionEnter ");
    }
 
    private void OnCollisionStay(Collision collision)
    {
       Debug.Log("碰撞器 OnCollisionStay ");    
    }
 
    private void OnCollisionExit(Collision collision)
    {       
       Debug.Log("碰撞器 OnCollisionExit ");
    }
    
    // --------------触发器--------------
    // 勾选isTrgger  
    private void OnTriggerEnter(Collider other)
    {       
       Debug.Log("触发器 OnTriggerEnter ");
    }
 
    private void OnTriggerStay(Collider other)
    {
       Debug.Log("触发器 OnTriggerStay ");
    }
 
    private void OnTriggerExit(Collider other)
    {
       Debug.Log("触发器 OnTriggerExit ");
    } 
}
// 相机移动脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveCamera : MonoBehaviour
{
    public float speed = 10;

    void Update()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        transform.Translate(new Vector3(h, v, 0) * Time.deltaTime * speed);
    }
}
// 子弹脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 绑在相机身上
public class Shoot : MonoBehaviour
{

    public GameObject bullet;
    public float speed = 50;

    public void send(){
        GameObject b = GameObject.Instantiate(bullet, this.transform.position, this.transform.rotation);
        Rigidbody rgd = b.GetComponent<Rigidbody>();
        rgd.velocity = this.transform.forward * speed;
        // 5秒后删除自己(子弹)
        Destroy(b, 5.0f);
    }
}
// 渲染爆炸
// 绑在子弹预制体上
public GameObject boom;

     // --------------碰撞器--------------
    private void OnCollisionEnter(Collision collision)
    {   
       Debug.Log("碰撞器 OnCollisionEnter ");
       GameObject b = GameObject.Instantiate(boom, this.transform.position, this.transform.rotation);
       Destroy(gameObject, 0.1f); // 删除子弹
       Destroy(b, 2.0f);   // 删除爆炸
    }