Unity使用之预设体&鼠标事件&刚体&碰撞和触发事件

预设体:

       预设体能够使游戏对象和资源重复使用,相同的游戏对象可以使用同一个预设体来创建,对预设体进行修改后,所有游戏对象都会相应改变。

 

游戏对象预设体的建立:

        在SampleScene中创建一个3D模型,命名player,然后在Assets中创建一个材质球拖到Scene中的player上,最后将SampleScene中的player拖入到Assets中,这样在Assets中的player就是预设体。可以通过改变刚刚那个材质球来改变预设体的属性,也可以通过拖拽预设体来在场景中添加相应的player。

Unity使用之预设体&鼠标事件&刚体&碰撞和触发事件_第1张图片

 

预设体脚本的挂载:

在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等方法。

Unity使用之预设体&鼠标事件&刚体&碰撞和触发事件_第2张图片

 

鼠标事件:

  • 当鼠标按下时调用
    void OnMouseDown();
  • 当鼠标取消点击时调用
    void OnMouseUp();
  • 当鼠标持续按下左键时调用
    void OnMouseDrag();
  • 当鼠标移动到目标内部时调用
    void OnMouseEnter();
  • 当鼠标离开目标时调用
    void OnMouseExit();
  • 当鼠标停留在游戏对象上时调用
    void OnMouseOver();
  • 当像点击按钮一样点击游戏对象(按下不松开然后将鼠标滑出游戏对象再松开 这次操作不使能)
    void OnMouseUpAsButton();

这个鼠标事件和Input方法的不同之处主要在目标不同,即鼠标事件要触发必须在某一个游戏对象内进行,但是Input是只要检测到鼠标点击动作进行就会触发。

 

刚体:

Unity使用之预设体&鼠标事件&刚体&碰撞和触发事件_第3张图片

 

         游戏对象的刚体属性是让对象可以受到力的作用。可以在属性面板中的Add Component进行搜索添加。

Unity使用之预设体&鼠标事件&刚体&碰撞和触发事件_第4张图片

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)

Unity使用之预设体&鼠标事件&刚体&碰撞和触发事件_第5张图片

 

碰撞和触发事件:

碰撞相关的有三个事件:

  1. 碰撞开始时会调用一次的事件:
    void OnCollisionEnter(Collision other) {}
  2. 碰撞结束时调用一次的事件:
    void OnCollisionExit(Collision other) {}
  3. 当碰撞持续发生的时候调用:
    void OnCollisionStay(Collision other) {}

Unity使用之预设体&鼠标事件&刚体&碰撞和触发事件_第6张图片

具有Collision和刚体属性的对象和任何有Collision的对象都会产生一次事件,包括地面。

触发器相关的三个事件:

  1. 刚刚进入触发范围调用一次:
    void OnTriggerEnter (Collider other) {}
  2. 持续待在触发范围内会一只调用:
    void OnTriggerStay (Collider other) {}
  3. 离开触发范围调用一次:
    void OnTriggerExit (Collider other) {}

 

你可能感兴趣的:(学习,unity)