Unity2D如何制作一个炮台追踪主角发射子弹
Posted Z_hongli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity2D如何制作一个炮台追踪主角发射子弹相关的知识,希望对你有一定的参考价值。
【Unity2D】如何制作一个炮台追踪主角发射子弹
【Unity2D】如何制作一个炮台追踪主角发射子弹
一、前言
(一)、制作想法来源
前段时间为期末考试写了一篇博客,其中涉及到一个发射子弹击中主角的效果,由此想到了去制作一个发射子弹的炮台,其中考试的博客原文链接:点我跳转
(二)、效果预览
二、制作流程
(一)、准备
1.炮台素材,我为了简单,自己用PS做了一个炮台图片,就两张图片,PS导出格式为PNG,在Unity中注意如果不是PNG格式的,记得改为PNG格式
当然你也可以在Unity里面创建image图片来拼接一个炮台,再修改其颜色,注意2D游戏里面层级要保持一致:
(二)、炮台的旋转
1.将炮台在2D场景中摆放好,调整好相关的层级,将炮台的Order in Layer设置为4,炮台地的Order in Layer设置为3,让炮台显示在炮台地上
2.调整炮台的中心,使图片中心在炮台的正方形的中心,我们在文件夹下找到炮台,点击Sprite Editor对其进行编辑来调整其中心点的位置,因为炮台的旋转是以正方形的中心为中心的,当然Pivot也能够修改图片的中心,但是修改的位置比较固定,所以我们用Sprite Editor来编辑。
打开Sprite Editor,将图片中心用鼠标移动到小正方的中心,然后Apply应用一下
这样我们回到场景中,通过旋转炮台我们可以发现,炮台的旋转已经是按小正方形的中心来旋转了
2.我们实现让炮台随着目标转动起来,这里我已经做好了一个2D人物,并且能够让他移动,可以在我的博客主页找到这个案例文章,在这里我也将案例链接给大家:点我跳转
接下来我们为炮台写一个旋转代码,来让炮台指向目标角色,点击炮台,为它添加一个脚本,我的脚本名称为:BigGun
public GameObject Player;
void Update()
{
Vector2 direction = Player.transform.position - transform.position;
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
//这里还可以使用 Quaternion.Lerp来实现平滑旋转
transform.rotation = Quaternion.AngleAxis(angle-90f, Vector3.forward);
//参数里面的angle-90 减不减因人而异 因为我导入的图片的他的轴向不对
}
来解释一下为什么这么写,也就是这个的原理:
1.我们首先要知道炮台和人物之间的坐标位置,得出其横纵的差距,通过其横纵的距离来计算一个角度,也就是tan值,画个图吧:
2.其次我们知道tanα之后,要将其转换为角度,涉及到数学知识为:
在代码中的表示:
再者我们要知道Mathf.Atan2函数的意思,在这里我查了一下官方的API:
找到了一个比较详细的解释这个函数的博客:点我跳转
我的理解是: Mathf.Atan2(direction.y, direction.x)将direction.y与 direction.x的角度计算出来,其结果为一个弧度值
角度=弧度×360/2π,代码表示就是:
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
3.再将得到的角度来作为旋转参数来实现旋转,使用函数的API
相关代码:
transform.rotation = Quaternion.AngleAxis(angle-90f, Vector3.forward); //transform.rotation等于挂载脚本的位置
最后说明一下:
transform.rotation = Quaternion.AngleAxis(angle-90f, Vector3.forward);
//参数里面的angle-90 减不减因人而异 因为我导入的图片的他的轴向不对
如果我不减去90:
减去90后:
这个是跟导入图片时他的轴向有关,具体的你自己做的时候来看,然后将目标角色拖拽给脚本的Player中
(三)、炮台的检测和发射子弹
1.为炮台加上一个圆形2D碰撞检测器,并调整其大小到一定的范围
2.接下来我们来制作子弹,要知道子弹的发射它是需要rigidbody组件和collider 2D组件的,把导入的子弹图标拖动到场景中,为其添加rigidbody和collider 2D,同时设置他的层级到合适的位置
接下来为子弹写一个代码,我命名为Gunbullet
private Rigidbody2D rigidbody;
void Awake()
{
rigidbody = this.GetComponent<Rigidbody2D>(); //获取这个脚本的rigidbody 2D
}
private void Start()
{
Destroy(gameObject, 5); //五秒后摧毁这个物体
}
public void Lauch(Vector2 direction, float force)
{
rigidbody.AddForce(direction * force); //direction是一个矢量
}
在这里面有一个比较值得注意的是AddForce这个函数,其相关API为:
注意一定要是矢量,在这里我对其研究了下,相关的文章链接:点我跳转
在其最下面:
在这里不作过多说明。
3.将其拖拽在文件夹下制作成为预制体:
4.为炮台添加代码(在这之前记得加圆形碰撞盒子 2D):
public GameObject Aim;
public GameObject BulletPrefab;
public float N = 50;
// public Rigidbody2D RubyRigidbody2D;
bool isAttack = false; //模式1触发
private Vector2 PlayerVect;
private Vector2 AttackVect;
float time = 0;
void Update()
{
PlayerVect.x = Aim.transform.position.x;
PlayerVect.y = Aim.transform.position.y;
AttackVect.x = PlayerVect.x - this.transform.position.x; //两坐标相减 得出一个向量 表示方向
AttackVect.y = PlayerVect.y - this.transform.position.y; //两坐标相减 得出一个向量 表示方向
if (isAttack)
{
time = time + Time.deltaTime;
if (time >= 0.25)
{
Launch();
time = 0;
}
}
}
private void Launch()
{
GameObject bullet = Instantiate(BulletPrefab, transform.position, Quaternion.identity); //Quaternion.identity 没有角度 (0,0,0)
bullet.GetComponent<GunBulllet>().Lauch(AttackVect, N); //我的子弹上绑上的脚本是GunBullet
//这里如果报错 你看看你的脚本名称是否和我的不一样 写自己脚本的名称
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "Player")
{
isAttack = true;
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.tag == "Player")
{
isAttack = false;
}
}
记得将发射口和子弹的collider 2D的is trigger勾上,不然无法触发检测:
5.将目标角色的标签更改为Player,没有的话就自己添加
注意:如果你子弹射不出来,可能是因为力太小了,子弹上的rigidbody2D的重力太重了,导致了射不出去,想想丢铅球就明白了
(三)、最后效果图
三、结束语
1.如果你按着这篇案例做,发现按照我的步骤做不能够卓出来或者有错误,可以私信留言给我,我看到后会第一时间去解决
2.点击我的主页,有很多的实用案例,欢迎来看看,对大多数人都是友好的:点我跳转
3.人物移动的代码也在我的主页中,欢迎来看看
喜欢的话点个赞支持一下吧~
以上是关于Unity2D如何制作一个炮台追踪主角发射子弹的主要内容,如果未能解决你的问题,请参考以下文章