找回密码
 立即注册
查看: 412|回复: 0

unity之路第一天——地图,角色,射击,音效

[复制链接]
发表于 2022-6-6 12:24 | 显示全部楼层 |阅读模式
2022.5.6 晴



主角能跳能跑,能根据鼠标点击方向发射子弹

之前陆陆续续看了一些unity的视频教程,也用unity自带案例进行简单的摆动,但今天才算是正式开始自己做项目的第一天。
今天是第一天,但实现了很多基础的功能:tile map的绘制,角色预制体的建立,角色左右移动,角色跳跃,子弹随鼠标点击方向发射和音效的使用。接下来一一记录下相关的难点和知识点,以便自己加深记忆。

tile map:

其实就是在场景中新建一个2D对象->瓦片地图->矩形
然后在窗口->2D->平铺调色盘
tile map有一点需要注意的是调色盘里的方块大小可能和地图网格不匹配,这里有两个修改方式:

  • 修改拖入调色盘中的精灵尺寸
  • 直接修改tile map的缩放
预制体:

预制体很简单了,其实就是在场景中新建一个物体,然后拖入到项目中的Prefab中,就成了预制体。相对重要的额一点是,修改Prefab中的预制体,拖到场景中是一致的。但修改已经在场景中的预制体,只是修改这个对象本身。

角色移动:

要控制角色的移动,首先要获取玩家的输入。比较常见的是通过键盘的W,A,S,D和方向键进行位置信息的输入。可能要现在输入管理器对键位意义进行设定。获取输入信息常用的两个函数为:

  • Input.GetAxis("Horizontal"); 获取范围为[-1,1],是一个虚拟轴。
  • Input.GetAxisRaw("Horizontal");获取范围为-1或1,适合用于修改朝向。
获取唯一信息后可以利用乘法去影响方向,这里就要说到怎么让对象移动。
角色移动的方法有很多,下面进行简单的总结:

  • 使用transform.Translate()函数:transform.Translate(Vector3.forward * Time.deltaTime);
  • 使用transform.Position()函数:直接指定新的位置transform.Position = new Vector2(0,0);
  • 使用Rigidbody2D组件的速度:要先获取组件,rb.velocity = new Vector2(x,y);
  • 使用Rigidbody2D组件的AddForce:对物体施加向量力改变位置,rb.AddForce(1,0,0);
需要额外说的点是:要注意左右走时的角色朝向要改变,用缩放函数transform.localScale = new Vector2( x, 1);

角色跳跃:

相较于左右移动来说,跳跃要更加复杂一点,因为涉及到起跳的加速度设置,落地的碰撞检测等。
首先获取跳跃信息用的是Input.GetButtonDown("jump");//jump需要提前设置
然后就是在y轴上的移动,移动方法可以参考上面的角色移动。在训练案例中我的左右移动和跳跃用的都是刚体速度。
则在按下跳跃键时,基于刚体y轴一个向上的速度:rb.velocity = Vector2.up * jumpForce;//jumpForce提前设置
除此之外要定义一个检测是否在地面上的方法,通过碰撞体的图层或者tag去判断是否是地面(背景也设置成了碰撞体)

子弹发射:

首先子弹是无限使用的物品,所以进行一个预制体的制作。子弹要有刚体组件和碰撞体组件。
首先为子弹挂载脚本,当子弹碰撞时,会自动销毁;没碰到物体,3秒后也会自动销毁,清理内存。
销毁函数:Destroy(gameObject, 3f);
子弹有了,要给时刻存在的玩家本身挂一个发射的脚本。当检测到鼠标点击时,要创建一个子弹对象,子弹对象被创建时就会自动执行它自带的脚本。
首先要说的难点是如何获取鼠标的坐标。在unity中,有屏幕坐标和世界坐标之分。
世界坐标与相机有关,屏幕坐标是
世界坐标转换为屏幕坐标,需要使用camera.WorldToScreenPoint(transform.position);
屏幕坐标转换为世界坐标,需要使用Camera.main.ScreenToWorldPoint(transform.position);
鼠标点击坐标为屏幕坐标,但角色自身坐标是世界坐标,所以要求角色到点击处的向量,要把屏幕坐标转换为世界坐标。
检测鼠标点击的世界坐标:RaycastHit2D  raycast=Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition),Vector2.zero);
然后和自身坐标相减,得到子弹位移方向的坐标direction。
然后生成子弹:GameObject bullet = Instantiate(bulletPrefab, curposition);//curposition是自身坐标
这里调用子弹的脚本函数:bulletControl bc = bullet.GetComponent<bulletControl>();
bc就是子弹的脚本bulletControl实例化的一个对象啦,可以使用脚本的方法,把得到的位移方向direction传入方法。基于该方向,给子弹施加一个力: rbody.AddForce(direction * moveForce);
这样子弹就可以朝你点击的方向飞去。

虽然飞去了,但是子弹的形状都没变,所以也要根据子弹的位移方向去调整子弹的形状(旋转角度)。
把子弹的头部改成前进方向:transform.up = direction;(注意,这里用up是因为预设子弹是头朝上的)

音效添加:

音效是游戏的重要元素之一,游戏没有了音效就像西方没有了耶路撒冷,3D区没有了蒂法。所以我们要在场景中创建一个Audio Source,挂载背景音乐。
然后写一个Audio Manager脚本挂载在Audio Source对象下,具体的代码都是网上直接copy的,用处就是提供一个方法audioS.PlayOneShot(clip);给其他需要用到音效的脚本去调用。

其他脚本需要用到音效,要先声明一个对象:public AudioClip shootClip;//发射音效
然后调用:AudioManager.instance.AudioPlay(shootClip);

好啦,以上就是我第一天学习和制作的内容,没想到东西不多,却写了这么久。但是有意义的是,在复写的过程中,我对于当时一些模棱两可的概念进行了进一步的了解,所以“学而时习之”是一个亘古不变的真理啊!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 04:23 , Processed in 0.128389 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表