【U3D实战笔记】2DProject:RushMan

本文详细介绍了在Unity3D中制作像素风格动画的步骤,包括使用Piskel绘制序列动画,设置U3D中的序列参数,以及创建和编辑动画。同时,讲解了音频资源的导入和播放控制,以及如何编写控制音频的脚本。此外,还深入探讨了对象交互,如碰撞检测和物体移动的编程技巧,如Time.deltaTime的使用。最后,分享了如何实现游戏退出和重新开始的代码逻辑。
摘要由CSDN通过智能技术生成

准备素材

动画

  1. Piskel:绘制像素风格序列动画(size:64*64),将绘制好的序列导出成png格式,再导入U3D。
  2. 在U3D中在inspector面板中设置序列参数:
变量参数
Texture TypeSprite(2D and UI)
Sprite ModeMultiple
Pixels Per Unit16
Max Size1024(清晰即可)
CompressionNone

注意:U3D中所用图片,若需要sprite类型,都需要修改其Texture Type变量如表格所示。

  1. 点击Apply后,点击Sprite Editor 编辑序列,在面板中修改Silce菜单栏如图所示,该步骤是为了切割序列为预设尺寸的图片,完成切割后,点击Sprite Editor面板中的Apply按钮。
    Slice菜单栏

  2. 制作动画:首先将切割好的图片选择一张或者一组(建议选择idle动画)拖入Hierachy面板中,选中该对象(下文称其为Player),在windows菜单栏中选中Animation,并为Player对象创建动画,将裁剪好的图片拖入时间轴中并调整速度。

  3. 将对象的动画都做好后,在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。

音频

  1. 音频可以从网上下载,也可以使用软件制作,我使用的是sfxr。将音频导入U3D的Project面板中,文件路径需要为Assets->Resources,以方便后续使用Resources.Load(name)导入音频文件,这里需要【注意】:如果资源不是直接放在Resources文件下,还需要记录Resources文件下资源所在的相对路径,否则会加载失败。
  2. 在Hierarchy中创建一个Audio Source,并将游戏的BGM拖入其变量AudioClip的参数栏中,勾选Loop,设为循环播放。
  3. 编辑控制音频播放的脚本,A脚本如果想调用B脚本中的共有函数,并作用于B脚本所挂载的游戏对象上,可以在B脚本中创建一个B脚本类的实例,并在Start函数中初始化该实例指向当前游戏对象,即instance=this,这样就能够在A脚本中通过调用B类实例来调用B类中的函数,从而作用于B脚本所挂载的对象。
//获得播放器
        player = GetComponent<AudioSource>();
        //加载音效
        AudioClip clip = Resources.Load<AudioClip>(name);
        //播放音效
        player.PlayOneShot(clip);

脚本编程问题解析

  1. A脚本要调用B脚本中的函数来作用于B脚本所在的对象,可以在A中调用在脚本B中实例化指向当前对象的实例,例如:class B instance=this;
  2. 当要设置对象在游戏中是否可见时,可以采用的办法有:
//对象失活
        overScene.SetActive(false);
        //对象依旧存在,只是不可见
        overScene.GetComponent<Renderer>().enabled = false;
  1. 水平翻转对象可以用以下两种方式:
    1).将对象的 localScale.x设置成相反数;
    2).将Sprite Renderer组件中的Flip的x勾选上
  2. 若要对象有物理特性,应该为对象加上Rigidbody组件。
    1)、对象跳跃:
GetComponent<Rigidbody2D>().AddForce(Vector2.up * height);

2)、获得对象的运动方向:

GetComponent<Rigidbody2D>().velocity.y < 0
  1. Time.deltaTime保存的是当前项目每帧的时间,是一个固定的值,可以用来间隔时间,做持续的效果。

  2. 函数OnCollisionEnter2D()和OnCollisionExit2D()可以用在触发对象的IsTrigger未被勾选时,用来检测碰撞;具体通过碰撞体的tag值来检测是否触发。

  3. 当碰撞体的IsTrigger是勾选状态时,此时对象是一个碰撞检测对象,可以使用OnTriggerEnter2D()和OnTriggerExit2D()来检测碰撞。

  4. 退出游戏代码:

#if UNITY_EDITOR
        //停止编辑
        UnityEditor.EditorApplication.isPlaying = false;
#endif
        Application.Quit();
    }
  1. 重新开始游戏代码:
    需要加域名using UnityEngine.SceneManagement;
        SceneManager.LoadScene(0);
  1. 摄像机随玩家移动:
 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;
  1. 对象斜着移动,只需要令Vector.up与Vector.right做加法:
transform.Translate((Vector2.up + dir) * 15 * Time.deltaTime);
  1. 3s后销毁对象:
Destroy(gameObject, 3f);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值