在上一次我们的不懈努力几行代码下,方块君想要移动的愿望算是满足了,然而第二个愿望——射击,算是暂时把神大人难住了:
作为一个伪3D游戏,假透视是绝对有必要去做的,但是随着方块君的左右移动量不同,子弹射出的角度也不同
不过现在先把发射子弹的函数做出来再说,船到桥头自然直嘛!于是将这个shoot()函数放进方块君的操作脚本里
void shoot(GameObject bul)
{
Instantiate(bul, transform.position, Quaternion.identity);
}
蓝鹅……至少现在并没有什么用处……
让我们再度分析一下吧:
我们可以得出一个三角形的两边三角,于是乎,由于速度是矢量可以平移,我们可以用两个方向的Translate()来对子弹运动进行模拟:
此外,我们还需要判断子弹前进的大方向:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class bullet : MonoBehaviour {
public float speedy, speedx, xsetoff, xangle;
public string dir;
void FixedUpdate () {
transform.Translate(Vector2.up * Time.deltaTime * speedy);//子弹的向前(上)移动
if (dir == "left")
{
transform.Translate(Vector2.left * Time.deltaTime * speedx);
}
else if (dir == "right")
{
transform.Translate(Vector2.right * Time.deltaTime * speedx);//子弹的左或右移动
}
if(transform.position.y>=2.5f){
Destroy(gameObject);//子弹出界,立刻销毁
}
}
public void makeMove(float x)
{
if (x > 0)//判断玩家所在位置是y轴左边还是右边
{
dir = "left";
}
else if (x < 0)
{
dir = "right";
}
else
{
dir = "up";//强迫症发作……
}
xangle = 45f * (1 - Mathf.Abs(x) / 8.0f) + 45f;//这个角是子弹射击方向和x轴的夹角
xsetoff = 5.0f / Mathf.Tan(xangle * Mathf.Deg2Rad);//注意⚠️Mathf关于三角函数的计算必须使用弧度制(曾经被坑过)
speedx = xsetoff / 0.5f;//常数
speedy = 5.0f / 0.5f;//强迫症
}
}
于是,这个设计子弹的代码就(暂时)完成了.dalao们也可以把这个看起来不漂亮的代码进行各种处理xi
我们在方块君的操控脚本里,只需要再改一下shoot()函数即可:
void shoot(GameObject bul)
{
shootTime = 0.5f;//这里是射击间隔时间
Instantiate(bul, transform.position, Quaternion.identity).GetComponent<bullet>().makeMove(transform.position.x);
//这回的Instantiate是不是有点奇怪?其实它的机制上还返回生成的物体,我们既可以用一个临时的GameObject储存它,如果只需要makeMove()一个
//操作的话只需要直接点号调用即可
}
至于射击间隔时间,使用计时器,和跳跃是一样的,自己尝试一下吧!
至于那些图片资源嘛:链接:https://pan.baidu.com/s/1f7rtLk5mmf7sO-LEeZA5Dw 密码:m4ko