先上效果图
放到人物身上的脚本Thefanattacks
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Thefanattacks : MonoBehaviour
{
public string BulletOrigin;//子弹父类的路径
public string bulletModelPath; //子弹模型路径
public int angle;//扇形的角度
public int interval;//间隔(间隔最好是Mathf.Abs(count / interval)*2 的偶数,负的也许只不过有一些偏差)
Vector3[] vectors;//数组
int sum;//记录最早角度(-(int)(angle/2))得到你输入的扇形角度的一半,负数角度
int count;//得到你输入的扇形角度的一半,负数角度
// Start is called before the first frame update
void Start()
{
sum = -(int)(angle/2);
count= -(int)(angle / 2);//得到你输入的扇形角度的一半,负数角度
int number = Mathf.Abs(count / interval)*2;
if (number % 2 == 0)//判断是否是偶数
{
vectors = new Vector3[Mathf.Abs(count / interval) * 2 + 1];
}
//else//判断是否是基数
//{
// vectors = new Vector3[Mathf.Abs(count / interval) * 2 + 2];
//}
}
// Update is called once per frame
void Update()
{
if(Input.GetKeyDown(KeyCode.Q))
{
if(vectors!=null)
{
Vector3 bornPos; //世界空间
Quaternion bornDir; //世界空间下的子弹方向
for (int i = 0; i < vectors.Length; i++)
{
vectors[i] = Quaternion.Euler(new Vector3(0, count, 0)) * Vector3.forward;
count += interval;
}
bornPos = transform.TransformPoint(new Vector3(0, 0, 0));
for (int i = 0; i < vectors.Length; i++)
{
vectors[i] = transform.TransformDirection(vectors[i]); //拿到世界空间下的方向表示
}
for (int i = 0; i < vectors.Length; i++)
{
bornDir = Quaternion.LookRotation(vectors[i]);
var prefabBulletOrigin = Resources.Load<GameObject>("Prefabs/" + BulletOrigin);//加载
var prefabBulletModel = Resources.Load<GameObject>($"Prefabs/Bullet/{bulletModelPath}");//加载
var bulletOriginGo = GameObject.Instantiate(prefabBulletOrigin, bornPos, bornDir);//实例化
var bulletModelGo = GameObject.Instantiate(prefabBulletModel, bulletOriginGo.transform);//实例化认父
bulletModelGo.transform.localPosition = Vector3.zero;
bulletModelGo.transform.localEulerAngles = Vector3.zero;
}
count = sum;
}
}
}
}
子弹的移动脚本Move
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour
{
public int speet;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
transform.Translate(transform.forward*Time.deltaTime* speet,Space.World);
Destroy(gameObject, 5);
}
}