Unity3D入门案例——古墓探险

  • 新建工程
  • 导入资源
  • 设计地形
  • 美化场景
  • 添加火焰(粒子效果)
  • 创建动画
  • 导航场景
  • 生成导航网格
  • 控制人物行走
  • 控制摄像机跟随
  • 角色动画播放
  • 创建状态机
  • 修改代码
  • 运行结果


新建工程

unity3d入门 unity3d入门项目有哪些_unity3d入门

导入资源

资源链接 提取码5n92 下载完成之后直接将拖转到 Project 面板。

同时导入Unity3D自带资源
如何引入资源

设计地形

1.新建 Terrian:在 Object 面板,右键 3D Object --> Terrian.
2.观察 Terrian 的 Inspector 面板,在设置选项(最右面螺母标志)Terrian Width 和 Terrian Length 调节场景长宽。
3.利用第1/2/3/4个选项设计地形,利用5/6选项卡绘制地貌(植被,湖泊等)功能如下:

选项卡

作用

Raise and lower terrain

绘制地形表面凹凸程度;如在绘制过程按下Shift则将地形向下凹陷。

Paint height

绘制地形高度

Smooth the terrain height

对地形表面进行平滑处理

Paint the terrain texture

绘制地形表面贴图

Unity3D设计地形详解

unity3d入门 unity3d入门项目有哪些_贴图_02

4.利用Unity3D自带资源进行植被的贴图。
点击package—>meshes—>prefabs/vegetations 引入预制体进行设计。
建议:相同形状或相同种类的预制体建议放在同一文件夹下,便于管理。

场景一:(只是一个练习)



unity3d入门 unity3d入门项目有哪些_点光源_03


场景二:(游戏场景)

unity3d入门 unity3d入门项目有哪些_贴图_04

美化场景

添加火焰(粒子效果)

1.添加灯光效果:引入多个点光源(可设置为不同颜色),同时调整原有平行光的角度,使画面有一种黄昏的感觉。

2.添加石墩与火把容器 package—>meshes—>prefabs,并在容器中放置点光源,调整。同时为点光源新建 effects --> Particle System。

3.对火把进行贴图 LightMapping。在 FX–Fire 文件夹下新建材质球,shader 设置为 Particles/Additive,贴图设为 flame4*4,背景设置为白色。

unity3d入门 unity3d入门项目有哪些_屏幕坐标_05


4.进入Particle System的 Inspector面板,进行参数的设置与调节。主要调节的参数如下打勾选项:

unity3d入门 unity3d入门项目有哪些_贴图_06


效果如下:

unity3d入门 unity3d入门项目有哪些_贴图_07

创建动画

1.灯光烘焙(可选):
1)勾选地形和灯光属性面板中的 Static。
2)点击window --> Lighting --> setting,获得 Lighting 界面,可与 Inspector 面板合并。
3)选中除火把以外的其余点光源,Inspector 面板 Mode 设置为 Baked。
4)在 Lighting 面板点击 generate lighting。当烘焙结束后,可将光源Inspector 属性面板中的灯光效果关闭,这样仍然会有灯光效果。

2.创建动画

1)点击火把点光源,Mode设为 Mixed

2)点击windows-> Animation -> Create -> Add Property,选择 Intensity。点击录制(功能栏红点),在不同时间点处,任意设置光源的 Intensity,为了效果更佳明显,数值波动可以大一些。

unity3d入门 unity3d入门项目有哪些_unity3d入门_08

动图效果如图:

unity3d入门 unity3d入门项目有哪些_屏幕坐标_09

导航场景

生成导航网格

1.新建 Navigation 面板:Window -> Navigation,可与其他面板合并。

2.场景烘焙:点击 Navigation 面板,选择Bake -> Bake。在烘焙之前要确保环境的Static是勾选上的(至少要保证Navigation Static是勾选上

3.细节处理
1)如果规定可以穿过植被,选中植被,在 Navigation -> object 面板取消Navigation Static 的勾选。
2)如果不想穿过某一物体(例如岩石),在 Navigation -> object 面板的 Navigation Area 选项卡选择 Not Walkable。如下图:



unity3d入门 unity3d入门项目有哪些_点光源_10

unity3d入门 unity3d入门项目有哪些_unity3d入门_11


控制人物行走

1.点击英雄,在人物身上添加 Nav Mesh Agent 组件,并调节包裹人物的圆柱体。圆柱体用来计算是否可以通过地域。



unity3d入门 unity3d入门项目有哪些_屏幕坐标_12


2.新建脚本“Hero”添加到英雄身上,利用鼠标控制英雄移动。

public class Hero : MonoBehaviour
{
    public UnityEngine.AI.NavMeshAgent agent;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))//只有当鼠标点击时,需要进行检测,0表示鼠标左键
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//获取射线。ScreenPointToRay将屏幕坐标转换成射线,通过鼠标点击进行屏幕坐标获取
            RaycastHit hit;//用来保存碰撞信息
            if (Physics.Raycast(ray, out hit)) //用来检测碰撞信息,传一个射线,再传一个输出
            {
                print(hit.point);//此时点击地面Console会出现相应的坐标destination来对目标位置进行设置
                agent.SetDestination(hit.point);//使用
            }
        }
    }
}

3.点击 Hero,在 Inspector 面板 Hero 组件中修改 Agent。

unity3d入门 unity3d入门项目有哪些_屏幕坐标_13

控制摄像机跟随

1.调整摄像机角度
2.创建脚本Follow Target,作为摄像机的组件,代码如下:

public class Followtarget : MonoBehaviour 
{
    public Transform hero;
    private Vector3 offset;

	void Start () {
        offset = transform.position - hero.position;
	}
	
	void Update () {
        transform.position = offset + hero.position;
	}
}

3.点击 Camera,在 Inspector 面板 FollowTarget 组件中修改。

unity3d入门 unity3d入门项目有哪些_unity3d入门_14

角色动画播放

创建状态机

1)在 Project 面板创建 Animator Controller,命名为 Hero Controlller 用来控制人物的动画。
2)点击Hero,将状态机拖拽到组件 Animator–Controller 中。

unity3d入门 unity3d入门项目有哪些_unity3d入门_15


3)选中 Hero 选择 window - Animator,将动画素材拖入素材界面。

unity3d入门 unity3d入门项目有哪些_点光源_16

4)如图所示,新建变量 speed,类型为float。

unity3d入门 unity3d入门项目有哪些_unity3d入门_17


5)在素材界面,点击状态框,右键 Make Transition,建立状态转换。点击右下角“+”引入变量,进行转换界限的速度设置。

unity3d入门 unity3d入门项目有哪些_屏幕坐标_18


界面上的hasExitTime:是否有状态退出时间。简单理解:开启表示等待当前动画进行完才可进行下一个动画;关闭表示可以立即打断当前动画并播放下一个动画。

6)点击 Hero,在 Inspector 面板 Animator 组件中修改 Controller,在 Hero 组件中修改 Anim。

unity3d入门 unity3d入门项目有哪些_点光源_19

此时点击播放,发现角色移动时没有发生变化。需要引入速度监听。

修改代码

public class Hero : MonoBehaviour
{
    public UnityEngine.AI.NavMeshAgent agent;
    public Animator anim;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))//只有当鼠标点击时,需要进行检测,0表示鼠标左键
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//获取射线。ScreenPointToRay将屏幕坐标转换成射线,通过鼠标点击进行屏幕坐标获取
            RaycastHit hit;//用来保存碰撞信息
            if (Physics.Raycast(ray, out hit)) //用来检测碰撞信息,传一个射线,再传一个输出
            {
                print(hit.point);//此时点击地面Console会出现相应的坐标destination来对目标位置进行设置
                agent.SetDestination(hit.point);//使用
            }
        }
        anim.SetFloat("speed", agent.velocity.magnitude);//只需要获取速度的大小
    }
}

运行结果

unity3d入门 unity3d入门项目有哪些_贴图_20