2D旋转武器及升级详解

本文介绍了如何在Unity中设计一个2D旋转武器系统,通过WeaponManager和WeaponShovel控制,每次升级增加一个旋转物体。利用LeanPool对象池进行对象生成、旋转和位置调整,同时注意了Despawn和Spawn操作对物体位置的影响。
摘要由CSDN通过智能技术生成

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);  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值