碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Say/Exit函数;
当Is Trigger=true时,碰撞器被物理引擎忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物体是否经过空间中的某个区域这时就可以用到触发器。
//寻找的目标
public Transform TransHero;
private NavMeshAgent agent;
//找到场景中的NavMesh代理
agent=this.GetComponent();
if(agent&&TransHero)
{
//使得代理不断寻找目标点的位置
agent.SetDestination(TransHero.transform.position);
}
void OnGUI()
{
GUI.Label(new Rect(0,0,200,100),"ABC");
strInput=GUI.TextField(new Rect(0,50,100,50),“strInput");
strTextArea = GUI.TextArea(new Rect(0,110,200,100), strTextArea);
strPW = GUI.PasswordField(new Rect(0,220,200,100), strPW,'*');
GUI.Button(new Rect(0,330,100,30),“确定");
}
用一个简单的demo实现上面的GUI,实现代码(并有注释解释了代码的各个参数的含义):
using UnityEngine;
using System.Collections;
public class showGUI : MonoBehaviour
{
private string strInput;
private string strTextArea;
private string strPW;
void OnGUI()
{
GUI.Label(new Rect(0, 0, 200, 100), "ABC");//在(0,0)位置创建一个宽为200,长为100的标签,在标签上显示的文本ABC
strInput = GUI.TextField(new Rect(0, 50, 100, 50), "strInput");//在(0,50)位置创建一个宽为100,长为50的输入框,默认文本为strInput
strTextArea = GUI.TextArea(new Rect(0, 110, 200, 100), "strTextArea");//在(0,110)位置创建一个宽为200,长为100的多行文本输入框,默认文本为strTextArea
strPW = GUI.PasswordField(new Rect(0, 220, 200, 100), "strPW", '*');//在(0,220)位置创建一个宽为200,长为100的密码字段,默认密码为strPW,用*号字符遮罩
GUI.Button(new Rect(0, 330, 100, 30), "确定");//在(0,330)位置上创建一个宽为100,长为30的按钮,在按钮上显示的文本为确定
}
}
实现效果:
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray,out hit))//如果命中
{
print(hit.collider.gameObject);//可以获得命中的游戏对象
}
//Physics.RaycastAll 投射一条光线返回所有碰撞