赞
踩
目录
参考课程案例设计 一 2D 游戏场景、玩家角色、敌人角色等。利用脚本控制角色运动和角色动画播放。
熟悉以下操作并实现有关功能:
1. 游戏资源导入
2. Sprite 精灵图片编辑
3. Tile 调色板编辑
4. 2D 场景瓦片地图编辑
5. 玩家角色、敌人角色编辑(刚体+碰撞体)
6. 利用 2D 素材制作动画剪辑
7. 角色 Animator 动画状态机编辑—混合树
8. 玩家角色移动控制
9. 2D 场景摄像机跟随等
资源包下载
创建地图
地面素材切割成块,铺路
具体设置:
1)纹理类型 设置如上图
2)调整Sprite模式为 多个
3)每单位像素由初始值100改为64。极其重要!
4)点击上图左下角按钮,切片并保存
创建调色板
笔刷
区域块
把元素填充到tilemap中
铺路
小池子的构造
选取边界的块来填充边界
效果
把树添加到场景中
调整tilemap图层顺序为-10,树就可以正常显示了
为树添加碰撞体
注意:
场景素材均设置为预制体
把树拖到预制体文件夹中
包括树、草、莲花,房子
调整树的碰撞盒大小后(对预制体修改后)
应用到场景的所有对象上
场景构造效果
创建一个空对象
把背景元素全部拖入到里面,方便管理
游戏角色导入
添加刚体和碰撞体
并把重力关闭
否则
若掉出地图,则设置重力为0
打开刚体选项 模拟
这样才能发生碰撞
不知道这是什么情况,Ruby被撞翻了...
勾选冻结旋转
即可解决
创建PlayerControl.cs
using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; public class PlayerControl : MonoBehaviour { public float speed = 15f; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { float moveX = Input.GetAxisRaw("Horizontal"); float moveY = Input.GetAxisRaw("Vertical"); Vector2 position = transform.position; position.x += moveX * speed * Time.deltaTime; position.y += moveY* speed * Time.deltaTime; transform.position = new Vector2(position.x, position.y); } }绑定到Ruby对象上即可
给树,房子添加碰撞盒
调整树与Ruby的碰撞盒至合适的大小
用刚体移动可以消除画面抖动
using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; public class PlayerControl : MonoBehaviour { public float speed = 15f; Rigidbody2D rbody;//定义2d刚体 // Start is called before the first frame update void Start() { rbody = GetComponent<Rigidbody2D>();//获取2d刚体 } // Update is called once per frame void Update() { float moveX = Input.GetAxisRaw("Horizontal"); float moveY = Input.GetAxisRaw("Vertical"); Vector2 position = transform.position; position.x += moveX * speed * Time.deltaTime; position.y += moveY* speed * Time.deltaTime; transform.position = new Vector2(position.x, position.y); rbody.MovePosition(position);//用刚体移动可以消除画面抖动 } }
摄像机跟随
要安装cinemachine插件
创建2D跟随摄像头
摄像头绑定角色对象
摄像机跟随范围
(该图参数效果不太好,很奇怪)
摄像机跟随范围调整
(这个参数用着不错)
设置遮挡效果
自定义轴,改z为0,2d没有z轴,y为1
效果
设置不可通行的区域
给瓦片地图 tilemap 添加碰撞器
- 添加了瓦片地图碰撞盒,却没有碰撞效果,没有被卡在原地 4/16最后一个视频 进度条:44:44(已解决)
所有瓦片碰撞器类型默认为精灵,表现为人物运动不会被阻碍
解决方法:
首先,把Ruby的碰撞检测设置成持续的,离散的速度过快时不够用
水池块儿碰撞器类型设置为精灵Sprite
关闭可以行走的瓦片的碰撞盒
人能走的地方,比如地砖,碰撞器设置为无
设置好后出现紫色方块
效果
对碰撞区域进行优化
添加复合碰撞器
(添加组件后自动添加刚体,中文版亦可用英文进行查找)
把多个小碰撞盒子化为一个整体进行优化
选择由复合使用
效果
- 为啥整合之后没有阻挡的效果了?
不知道怎么回事,反正最后解决了
场景碰撞盒子设置为静态
此外,自动添加的tilemap刚体属性需要手动调整为静态
这样场景才不会下坠
- 这是啥错误
已解决,原因是许可证过期,更新一下许可证就好了,unity许可证怎么天天都要更新,毫无人性
- 一个bug
直行不能穿越边界,是正常的
但是直行的时候,同时按一下左右键,就可以卡过边界
原因:瓦片的碰撞盒子没有整合,中间有缝
消除蓝色的边界外视野,将视野局限于地图内
找到虚拟摄像机的扩展
添加CM视野局限器
confine v.限制
新建一个空对象
添加多边形碰撞器
编辑边界
设置多边形边界为地图边界
绑定边界对象
调整CM视野碰撞体为触发器
以免人物被挤出地图
效果
运动到边界时,视野被局限在地图内
(markdown:上一个方块双回车,再删除)
游戏动画的实现
主角各种角度各种状态的动画
建立动画文件夹
一同选定一组图片作为动画的4帧,拖到对象栏上
作为一个对象放到动画文件夹下
动画文件夹出现以下两个文件
选择三角形文件
看到右下角这一栏
把它往上拉
把Ruby对象拖入才能播放
动画播放速度略快
调整动画播放速度,双击三角形打开
12->4 帧
- 为啥我的面板没有采样
窗口时间轴那一行最右边有三个点
点一下,show sample rate调整跑动方向
把动画移动至Ruby属下,添加属性键亮起(原为灰且无法操作)
增加翻转的属性,让其向右跑,沿着x轴水平翻转
记得勾选这个,才能翻转
把运动状态的上下左右的动画都绑定在ruby上,还有静止的上下左右一并绑定上
共4*2种状态
建立一个动画状态集
以确保动画与运动状态一致
Ruby动画集绑定到Ruby对象上
双击打开
建立一个静止状态树idle,建立一个跑步状态树run
双击进入idle,添加4个运动
添加参数
修改混合树类型
设定参数
修改参数
把参数与运动状态关联起来
同理,添加跑动状态
添加状态转换
单击
状态转换条件
速度大于0.1跑动
速度小于0.1静止站立
绑定动画状态集,添加到ruby组件上
修改speed->runspeed
发生重名
修改脚本
using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; public class PlayerControl : MonoBehaviour { public float speed = 15f; Rigidbody2D rbody;//定义2d刚体 Animator anim;//定义动画 Vector2 lookDirection = new Vector2(1, 0);//初始向x看 // Start is called before the first frame update void Start() { rbody = GetComponent<Rigidbody2D>();//获取2d刚体 anim = GetComponent<Animator>();//获取动画组件 } // Update is called once per frame void Update() { float moveX = Input.GetAxisRaw("Horizontal"); float moveY = Input.GetAxisRaw("Vertical"); Vector2 moveVector = new Vector2(moveX, moveY); if(moveX!=0||moveY!=0) { lookDirection = moveVector; } Vector2 position = transform.position; position.x += moveX * speed * Time.deltaTime; position.y += moveY * speed * Time.deltaTime; transform.position = new Vector2(position.x, position.y); rbody.MovePosition(position);//用刚体移动可以消除画面抖动 anim.SetFloat("move X",lookDirection.x);//为动画集赋值 anim.SetFloat("move Y",lookDirection.y); anim.SetFloat("runspeed", moveVector.magnitude);//状态集的切换由运动矢量决定 //赋值必须与状态集命名一样 } }效果
成功实现8种状态
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。