准备素材
动画
- Piskel:绘制像素风格序列动画(size:64*64),将绘制好的序列导出成png格式,再导入U3D。
- 在U3D中在inspector面板中设置序列参数:
变量 | 参数 |
---|---|
Texture Type | Sprite(2D and UI) |
Sprite Mode | Multiple |
Pixels Per Unit | 16 |
Max Size | 1024(清晰即可) |
Compression | None |
注意:U3D中所用图片,若需要sprite类型,都需要修改其Texture Type变量如表格所示。
-
点击Apply后,点击Sprite Editor 编辑序列,在面板中修改Silce菜单栏如图所示,该步骤是为了切割序列为预设尺寸的图片,完成切割后,点击Sprite Editor面板中的Apply按钮。
-
制作动画:首先将切割好的图片选择一张或者一组(建议选择idle动画)拖入Hierachy面板中,选中该对象(下文称其为Player),在windows菜单栏中选中Animation,并为Player对象创建动画,将裁剪好的图片拖入时间轴中并调整速度。
-
将对象的动画都做好后,在Animation中规定其触发顺序和条件,其中:
(1).鼠标右键菜单中Create State->From New Blend Tree,可以利用float变量,用来制作多个动画之间的切换,例如本项目中,玩家走路动画和举箱子走路动画就可以做成一个融合树,融合树中通过float变量Isbox来控制举箱子和不举箱子之间动画的切换。
(2).Bool类型变量可以用来控制需要持续的动画的播放,当Bool值为true或者false时,将会维持其代表的动画状态。
(3).Trigger类型变量用来触发动画播放一次,播放完毕后回到设定的后继状态。
(4).如果动画间的转换不需要过度,则需要在inspector面板中将二者之间Transition的Has Exit Time去掉勾选,并修改Setting->Transition Duration=0。
音频
- 音频可以从网上下载,也可以使用软件制作,我使用的是sfxr。将音频导入U3D的Project面板中,文件路径需要为Assets->Resources,以方便后续使用Resources.Load(name)导入音频文件,这里需要【注意】:如果资源不是直接放在Resources文件下,还需要记录Resources文件下资源所在的相对路径,否则会加载失败。
- 在Hierarchy中创建一个Audio Source,并将游戏的BGM拖入其变量AudioClip的参数栏中,勾选Loop,设为循环播放。
- 编辑控制音频播放的脚本,A脚本如果想调用B脚本中的共有函数,并作用于B脚本所挂载的游戏对象上,可以在B脚本中创建一个B脚本类的实例,并在Start函数中初始化该实例指向当前游戏对象,即instance=this,这样就能够在A脚本中通过调用B类实例来调用B类中的函数,从而作用于B脚本所挂载的对象。
//获得播放器
player = GetComponent<AudioSource>();
//加载音效
AudioClip clip = Resources.Load<AudioClip>(name);
//播放音效
player.PlayOneShot(clip);
脚本编程问题解析
- A脚本要调用B脚本中的函数来作用于B脚本所在的对象,可以在A中调用在脚本B中实例化指向当前对象的实例,例如:class B instance=this;
- 当要设置对象在游戏中是否可见时,可以采用的办法有:
//对象失活
overScene.SetActive(false);
//对象依旧存在,只是不可见
overScene.GetComponent<Renderer>().enabled = false;
- 水平翻转对象可以用以下两种方式:
1).将对象的 localScale.x设置成相反数;
2).将Sprite Renderer组件中的Flip的x勾选上 - 若要对象有物理特性,应该为对象加上Rigidbody组件。
1)、对象跳跃:
GetComponent<Rigidbody2D>().AddForce(Vector2.up * height);
2)、获得对象的运动方向:
GetComponent<Rigidbody2D>().velocity.y < 0
-
Time.deltaTime保存的是当前项目每帧的时间,是一个固定的值,可以用来间隔时间,做持续的效果。
-
函数OnCollisionEnter2D()和OnCollisionExit2D()可以用在触发对象的IsTrigger未被勾选时,用来检测碰撞;具体通过碰撞体的tag值来检测是否触发。
-
当碰撞体的IsTrigger是勾选状态时,此时对象是一个碰撞检测对象,可以使用OnTriggerEnter2D()和OnTriggerExit2D()来检测碰撞。
-
退出游戏代码:
#if UNITY_EDITOR
//停止编辑
UnityEditor.EditorApplication.isPlaying = false;
#endif
Application.Quit();
}
- 重新开始游戏代码:
需要加域名using UnityEngine.SceneManagement;
SceneManager.LoadScene(0);
- 摄像机随玩家移动:
Vector3 v = transform.position;
v.x = target.position.x;
if (v.x > Max)
{
v.x = Max;
}
else if (v.x < Min)
{
v.x = Min;
}
transform.position = v;
- 对象斜着移动,只需要令Vector.up与Vector.right做加法:
transform.Translate((Vector2.up + dir) * 15 * Time.deltaTime);
- 3s后销毁对象:
Destroy(gameObject, 3f);