2D旋转武器设计
-
等级为1时,有1个物体围绕角色进行旋转,同时距离为1.5f,当敌人触碰到时,造成伤害
-
Game窗口和结构层级如下图:
-
其中WeaponManager是所有武器总控制物体
-
WeaponShovel是当前这个2D旋转近战武器的控制体,旋转在这个物体产生
-
BulletShovel是具体与敌人发生碰撞的物体
武器升级设计
- 每次升级增加1个物体,位置依旧是正向位置的1.5f,同时调整Bullet的旋转
- 当物体为3时示意图:
测试实现
测试代码
- 挂载在WeaponShovel这个武器控制体上
- 使用了Lean Pool 对象池免费插件,链接:Lean Pool
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace TestCodes
{
public class TestRotationParent : MonoBehaviour
{
public GameObject Prefab;
public int Number;
public List<GameObject> ListShovel = new List<GameObject>();
private void Start()
{
var obj = Lean.Pool.LeanPool.Spawn(Prefab, new Vector3(0, 1.5f, 0), Quaternion.identity, transform);
ListShovel.Add(obj);
}
void Update()
{
transform.Rotate(new Vector3(0, 0, 90) * Time.deltaTime);
}
// 第一步,回收进对象池
public void GenerateStart()
{
foreach (var shovel in ListShovel)
{
Lean.Pool.LeanPool.Despawn(shovel);
}
}
// 第二步,根据数量生成
public void GenerateSecond()
{
// 列表是存储的引用,所以直接添加会重复引用同一个物体,可以先清空一次,或者在添加时做判断检测
ListShovel.Clear();
for (int index = 0; index < Number; index++)
{
var obj = Lean.Pool.LeanPool.Spawn(Prefab, transform);
ListShovel.Add(obj);
}
}
// 第三步,调整旋转角度
public void GenerateThird()
{
var angle = 360 / Number;
for (int index = 0; index < ListShovel.Count; index++)
{
ListShovel[index].transform.Rotate(Vector3.forward * angle * index);
}
}
// 第四步,调整位置
public void GenerateForth()
{
var angle = 360 / Number;
for (int index = 0; index < ListShovel.Count; index++)
{
ListShovel[index].transform.Translate(ListShovel[index].transform.up * 1.5f, Space.World);
}
}
// 整合之前步骤
public void GenerateConclusion()
{
foreach (var shovel in ListShovel)
{
Lean.Pool.LeanPool.Despawn(shovel);
}
ListShovel.Clear();
for (int index = 0; index < Number; index++)
{
var obj = Lean.Pool.LeanPool.Spawn(Prefab, transform);
ListShovel.Add(obj);
}
var angle = 360 / Number;
for (int index = 0; index < ListShovel.Count; index++)
{
ListShovel[index].transform.Rotate(Vector3.forward * angle * index);
ListShovel[index].transform.Translate(ListShovel[index].transform.up * 1.5f, Space.World);
}
}
}
}
总结
- Lean.Pool.LeanPool这个对象池,Despawn回收的时候,不会自动重置对象的位置,比如收回之前为(1,1,1),那么在池子中,他的Position依旧为(1,1,1),是localPostion,但是Spawn指定父对象Parent时,会重置localPositon为(0,0,0)
- 要在Scene窗口中的Local的Y轴上移动的话,要选择物体自身的transform.up,同时要Space.World,不能用Self,Self会有一些直接看不出的移动。
- 核心代码:
transform.Translate(transform.up * 1.5f, Space.World);