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设计地形详解
4.利用Unity3D自带资源进行植被的贴图。
点击package—>meshes—>prefabs/vegetations 引入预制体进行设计。
建议:相同形状或相同种类的预制体建议放在同一文件夹下,便于管理。
场景一:(只是一个练习)
场景二:(游戏场景)
美化场景
添加火焰(粒子效果)
1.添加灯光效果:引入多个点光源(可设置为不同颜色),同时调整原有平行光的角度,使画面有一种黄昏的感觉。
2.添加石墩与火把容器 package—>meshes—>prefabs,并在容器中放置点光源,调整。同时为点光源新建 effects --> Particle System。
3.对火把进行贴图 LightMapping。在 FX–Fire 文件夹下新建材质球,shader 设置为 Particles/Additive,贴图设为 flame4*4,背景设置为白色。
4.进入Particle System的 Inspector面板,进行参数的设置与调节。主要调节的参数如下打勾选项:
效果如下:
创建动画
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,为了效果更佳明显,数值波动可以大一些。
动图效果如图:
导航场景
生成导航网格
1.新建 Navigation 面板:Window -> Navigation,可与其他面板合并。
2.场景烘焙:点击 Navigation 面板,选择Bake -> Bake。在烘焙之前要确保环境的Static是勾选上的(至少要保证Navigation Static是勾选上)
3.细节处理
1)如果规定可以穿过植被,选中植被,在 Navigation -> object 面板取消Navigation Static 的勾选。
2)如果不想穿过某一物体(例如岩石),在 Navigation -> object 面板的 Navigation Area 选项卡选择 Not Walkable。如下图:
控制人物行走
1.点击英雄,在人物身上添加 Nav Mesh Agent 组件,并调节包裹人物的圆柱体。圆柱体用来计算是否可以通过地域。
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。
控制摄像机跟随
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 组件中修改。
角色动画播放
创建状态机
1)在 Project 面板创建 Animator Controller,命名为 Hero Controlller 用来控制人物的动画。
2)点击Hero,将状态机拖拽到组件 Animator–Controller 中。
3)选中 Hero 选择 window - Animator,将动画素材拖入素材界面。
4)如图所示,新建变量 speed,类型为float。
5)在素材界面,点击状态框,右键 Make Transition,建立状态转换。点击右下角“+”引入变量,进行转换界限的速度设置。
界面上的hasExitTime:是否有状态退出时间。简单理解:开启表示等待当前动画进行完才可进行下一个动画;关闭表示可以立即打断当前动画并播放下一个动画。
6)点击 Hero,在 Inspector 面板 Animator 组件中修改 Controller,在 Hero 组件中修改 Anim。
此时点击播放,发现角色移动时没有发生变化。需要引入速度监听。
修改代码
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);//只需要获取速度的大小
}
}
运行结果