1.Unity3d中的碰撞器和触发器的区别?
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Say/Exit函数;
当Is Trigger=true时,碰撞器被物理引擎忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物体是否经过空间中的某个区域这时就可以用到触发器。
2.物体发生碰撞的必要条件?
两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody物体,而且必须是运动的物体带有Rigidbody脚本才能检测到碰撞。
3.CharacterController和RIgidbody的区别
Rigidbody具有完全真实物理的特性,Unity中物理系统最基本的一个组件,包含了常用的物理特性,而CharacterController可以说是受限的Rigidbody,具有一定的物理效果但不是完全真实的,它不会受力的作用,是Unity为了使开发者能方便的开发第一人称视角的游戏而封装的一个组件。
4.获取、增加、删除组建的命令分别是什么?
获取:GetComponent 增加:AddComponent 删除:Destroy
5.调试记录到控制台的命令是什么?
Debug.Log();或者print();
6.Prefab的作用?如何在移动环境的设备下恰当地使用它?
Prefab是预设体,在实例化的时候用到,主要用于经常会用到的物体,属性方便修改。 在游戏运行时实例化,Prefab相当于一个模板,对已经有的素材、脚本、参数做一个默认的配置,以便于以后的修改,同时Prefab打包的内容简化了导出的操作,便于团队的交流。
7.导航网格寻路一般要经过哪些步骤实现对目标的查找?
一般经过四个步骤来实现: (1)选择除了主角、目标以及摄像机、直线光以外的所有物体,在Inspector窗口的右上角勾选Static,称为静态物体,并设置为Navigation Static静态类型。 (2)在主窗口中选择[Window]→[Navigation],打开Navigation窗口。该窗口用于生成路径寻找所需要的导航网格寻路,代理将根据该导航网格进行寻路计算。确保勾选了“Navigation Static”。点击Bake进行烘培。 (3)选择需要寻路的游戏对象,为它添加一个NavMeshAgent组件。 (4)编写寻路代码,新建一个脚本。 寻路代码:
//寻找的目标
public Transform TransHero;
private NavMeshAgent agent;
//找到场景中的NavMesh代理
agent=this.GetComponent<NavMeshAgent>();
if(agent&&TransHero)
{
//使得代理不断寻找目标点的位置
agent.SetDestination(TransHero.transform.position);
}
8.解释以下代码的各个参数的含义:
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的按钮,在按钮上显示的文本为确定
}
}
实现效果:
9.组件的动态调用
cube1.AddComponent("script1");//把script1这个脚本添加到cube1这个组件上
Destory(cube1.GetComponent("scripts"));//销毁cube1对象上附加的脚本组件实例 Destory(cube1.GetComponent<script1>()); 可以运用GetComponent<脚本名称>().字段名称,进行间的数据传递。
10.射线的使用
射线是一个点向另外一个点发生的一条线,一旦与其他模型发生碰撞,它将停止发射。注意这条线是逻辑上的,界面上看不到。一般使用射线判断是否发射至某个游戏对象上或者获得鼠标点击的游戏对象等。 射线是从摄像机发出去的。 关键代码:
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray,out hit))//如果命中
{
print(hit.collider.gameObject);//可以获得命中的游戏对象
}
//Physics.RaycastAll 投射一条光线返回所有碰撞