Archive for 三月, 2013

Unity3D协程闭包事件执行定时器

星期一, 三月 11th, 2013 553 views

介于U3D没有一个自带的事件执行定时器,所以打算自己动手做一个,基本思路如下,先用伪代码来写了

1
2
3
4
5
6
void timer(int time,Func func){

wait(time);//等待N秒
func();//执行传入的函数

}

最开始的思路是用闭包加线程来实现,之后和群里的朋友讨论了下,经过提示其实可以避免去碰线程这种bug多发产物,取而代之的是U3D包里自带的一个协程MonoBehaviour.StartCoroutine

先来完善下我们的事件定时器,惯例直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using UnityEngine;
using System.Collections;
using System;

public class EventTimer : MonoBehaviour {


    public IEnumerator Timer(float waitTime , Func[bool> func)
    {
        yield return new WaitForSeconds(waitTime);
        func();
   
    }

}

(更多…)

Unity3D摄像机高级控制

星期一, 三月 11th, 2013 1,195 views

在游戏场景中,通常摄像机如果需要进行一些不规则的固定运动,比如片头的场景摄像机的移动,此时如果通过代码来控制,虽然可以实现但调试过程并不直观,所以我们可以通过绑定摄像机动作来达到这一效果。
创建动作的过程这里不再赘述,前面的文章中有详细的讲解。

首先将创建好的动作绑定至摄像机,利用关键帧补间动画进行摄像机运动控制,如图

点击播放即可查看摄像机的实时运动效果,这里主要是针对xyz的位置及角度6个参赛进行调整,从而实现电影版的摄像机运动效果,这里我们且将动作命名为Move,并绑定至1号摄像机上

接下来我们创建一个摄像机管理脚本 CameraManger.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using UnityEngine;
using System.Collections;

public class CameraManger : MonoBehaviour {

    public GameObject Camera_1;
    public GameObject Camera_2;
    public GameObject Camera_3;
   

    // Use this for initialization
    void Start () {
   
    }
   
    // Update is called once per frame
    void Update () {


        switch (Main.state)
        {
            case Main.STATE.READY:
                onActiveFalse();
                Camera_1.SetActive(true);
                Camera_1.animation.Play("move");

                break;

            case Main.STATE.START:
                onActiveFalse();
                Camera_2.SetActive(true);                
                break;

            default:
                break;

        }
   
    }

    void onActiveFalse()
    {
        Camera_1.SetActive(false);
        Camera_2.SetActive(false);
        Camera_3.SetActive(false);
    }
}

(更多…)

Unity3D碰撞检测及Trigger触发器的使用及注意事项

星期六, 三月 9th, 2013 5,413 views

首先新建一个Cube,其本身就已自带了碰撞器Collider,如图

要使用Trigger检测物体进入,则需要勾选Is Trigger选项
碰撞检测触发器Trigger 有别于碰撞检测器 Collision,其可以不受物理效果影响,一些可穿透区域的碰撞检测,可以使用Trigger来进行碰撞检测
常用方法如下:
OnTriggerEnter 进入时
OnTriggerExit 离开时
OnTriggerStay 处于时

同上碰撞检测器 Collision 也有3个方法:
OnCollisionEnter
OnCollisionExit
OnCollisionStay

这里我们需要为跑道添加一个终点撞线的机制,所以使用可穿透的碰撞检测触发器Trigger

代码如下:

1
2
3
4
5
    void OnTriggerEnter(Collider collider)
    {
        print(collider.gameObject.name + ":" + Time.time);
     
    }

OnTriggerEnter传入的参数必须为Collider,故能触发该函数的对象必须具有Collider组建。这里我们用的是角色控制器Character Controller 自带了Collider组建
此时每当有角色撞线时即会打印角色名及系统时间
(更多…)

Unity3D角色控制器的使用及游戏对象移动速度控制

星期四, 三月 7th, 2013 1,502 views

首先是角色控制器的添加 选定模型对象 在其Inspector视图中选择Add Component -> Physics -> Character Controller 出现组建如下图

此时模型对象上会出现一个胶囊体,通过改变Center、Radius以及Hight的值来调整胶囊体的位置,使之恰好包裹住模型对象,如下图


(更多…)

Unity3D模型导入与动画播放

星期二, 三月 5th, 2013 670 views

首先是模型的导入,方法比较多,但常规的是将FBX模型文件拖放至Project视图中即可自动载入,这里以某狼人模型为例,导入后效果如图,材质及动画都已绑定好,详细操作方式和注意事项后面文章会叙述。

下面叙述下如何用代码来对模型的动画播放进行控制

动画都是预先由美术设计好的,并且已经到处为资源文件,通过载入Unity中并与模型绑定即可,如图

animation中列出的即是此模型所绑定的动作动画,最上方的为默认动画设置,勾选下方play automatically 选项后即可自动播放默认动画。

现在我们通过脚本来控制动画播放。以最简单的为例,大家自己举一反三:

1
2
3
4
5
6
7
8
9
10
11
12
using UnityEngine;
using System.Collections;

public class AnimationManger : MonoBehaviour {
   
    // Update is called once per frame
    void Update () {

              gameObject.animation.Play("这里输入动作名 如 run");

    }
}

注意动作名必须和Animation表单中的一致,将脚本绑定到该Gameobject上,运行,效果如同

可以看到狼人开始奔跑起来了。

通过代码量的扩充我们即可达到自由超控动作动画的播放。
本章节仅为动画播放最基础教程,更多高级教程欢迎继续关注。

BeiTown
2013.03.05