预设体:
预设体能够使游戏对象和资源重复使用,相同的游戏对象可以使用同一个预设体来创建,对预设体进行修改后,所有游戏对象都会相应改变。
游戏对象预设体的建立:
在SampleScene中创建一个3D模型,命名player,然后在Assets中创建一个材质球拖到Scene中的player上,最后将SampleScene中的player拖入到Assets中,这样在Assets中的player就是预设体。可以通过改变刚刚那个材质球来改变预设体的属性,也可以通过拖拽预设体来在场景中添加相应的player。
预设体脚本的挂载:
在Assets中Create一个C#脚本,然后直接拖拽到预设体的属性面板上即可。同时在预设体中挂载脚本也会使其他通过预设体产生的player身上挂载上相应的脚本。
预设体的控制:
在预设体的控制面板中进行设置,都会将对应设置辐射到所有预设体产生的player。
Select:将预设体进行高亮选中;
Revert:将对player的设置还原;
Apply:任意一个预设体产生的player进行设置都是独立的,当进行Apply操作时就会把这个player的sh设置应用到预设体上,进 而所有通过预设体ch产生的player都会有相应的操作。
使用脚本动态的创建预设体对象:
首先在项目中添加一个空对象,一般都是可以改名叫GameController,可以挂载不同的脚本进行游戏的控制。
用预设体创建对象,首先要获取这个预设体,要把这个游戏对象通过公共字段la来获取。
public GameObject playerPrefab;
脚本中会出现一个属性栏,属性栏中需要一个Game Object类型的资源,然后直接把player的预设体直接拖拽到这个属性栏中。
这样这个脚本就获取了相应的预设体。
然后通过Instantiate()方法进行创建对象。
Instantiate(playerPrefab); //将playerPrefab当做预设体进行创建游戏对象
这种方法创建的游戏对象都在同一个位置,如果想要创建不同位置的游戏对象,而且随机分布在一个范围内也是可以的。
Instantiate(playerPrefab, pos, Quaternion.AngleAxis(angle, Vector3.up)); // 预设体对象;创建的初始位置;创建出初始旋转角度
同时这个方法可以返回一个object的值,我们用GameObject类型进行接收,用as进行转换。
GameObject p = Instantiate(playerPrefab, pos, Quaternion.AngleAxis(angle, Vector3.up)) as GameObject;
这样之后p就是一个GameObject类型的对象,可以用之前的Addcomponent等方法。
鼠标事件:
- 当鼠标按下时调用
void OnMouseDown(); - 当鼠标取消点击时调用
void OnMouseUp(); - 当鼠标持续按下左键时调用
void OnMouseDrag(); - 当鼠标移动到目标内部时调用
void OnMouseEnter(); - 当鼠标离开目标时调用
void OnMouseExit(); - 当鼠标停留在游戏对象上时调用
void OnMouseOver(); - 当像点击按钮一样点击游戏对象(按下不松开然后将鼠标滑出游戏对象再松开 这次操作不使能)
void OnMouseUpAsButton();
这个鼠标事件和Input方法的不同之处主要在目标不同,即鼠标事件要触发必须在某一个游戏对象内进行,但是Input是只要检测到鼠标点击动作进行就会触发。
刚体:
游戏对象的刚体属性是让对象可以受到力的作用。可以在属性面板中的Add Component进行搜索添加。
Mass:质量(相对单位)
Drag:空气阻力
Angular Drag:角阻力
Use Gravity:是否使用重力
Is Kinematic:是否使用动力学
Interpolate:使用差值 (Interpolate:内差值(通过当前帧的上一帧来推算);Extrapolate:外差值(通过预测后一帧的位置来 推现在))
Collision Detection:碰撞检测
Constraints:约束(可以冻结不同方向力的作用)
下面这些方法是属于Rigidbody中的方法,使用之前要用Rigidbody类型的变量来获取相应组件。
- 给当前游戏对象添加一个力
AddForce(new Vector3(0f, 10f, 0f)) - 给当前游戏对象添加力矩/扭矩,可以使物体旋转
AddTorque(new Vector3(0f, 10f, 0f) - 给游戏对象在指定的位置上添加一个力
AddForceAtPosition(new Vector3(0f, 10f, 0f), new Vector3(0.5f, 0.5f, 0.5f)) - 在指定位置添加爆炸力
AddExplosionForce(1500f, Vector3.zero, 4f)
碰撞和触发事件:
碰撞相关的有三个事件:
- 碰撞开始时会调用一次的事件:
void OnCollisionEnter(Collision other) {} - 碰撞结束时调用一次的事件:
void OnCollisionExit(Collision other) {} - 当碰撞持续发生的时候调用:
void OnCollisionStay(Collision other) {}
具有Collision和刚体属性的对象和任何有Collision的对象都会产生一次事件,包括地面。
触发器相关的三个事件:
- 刚刚进入触发范围调用一次:
void OnTriggerEnter (Collider other) {} - 持续待在触发范围内会一只调用:
void OnTriggerStay (Collider other) {} - 离开触发范围调用一次:
void OnTriggerExit (Collider other) {}