最近我在准备一个比赛 然后现在的想法是做一个2D的类似于跑酷的游戏
然后就想到做一个冲刺的效果(不单单是速度的改变 还有身后的残影)
和上几篇博客一样 还是用之前超级玛丽来实现的 效果如下
这里边会用到队列和对象池的知识 我之前写过栈和队列还有对象池的博客 可能对大家有用
然后就开始我们的实现过程吧
我的思路是创建一个对象池 然后每次按下特定的冲刺键的时候 对象池中显示出来
在冲刺时间过后 再隐藏掉
然后对象池中的预制体 我们通过代码给他赋值为玩家上几个位置的精灵图片和位置 旋转 大小等
我们这个脚本大致分为3个 一个是预制体挂载的控制精灵贴图等的 一个是控制对象池的 还有一个就是玩家控制器中修改速度等参数的
下面先给出控制精灵贴图的代码
private Transform player;//玩家
private SpriteRenderer thissprite;//当前的sprite
private SpriteRenderer playersprite;//玩家的sprite
private Color color;
[Header("时间控制参数")]
public float activetime;//允许存在的时间
public float activestart;//开始的时间
[Header("不透明度参数")]
private float alpha;
public float alphamul;//变化的速度
public float alphaset;//初始值
private void OnEnable()
{
player = GameObject.Find("Mario").transform;//我的玩家叫 马里奥(Mario)查找了一下 直接赋值也可以
thissprite = GetComponent<SpriteRenderer>();//获得预制体上的 贴图组件
thissprite.sortingOrder = 100;
playersprite = player.GetComponent<SpriteRenderer>();//赋值为玩家的贴图组件
alpha = alphaset;//设置初始值
thissprite.sprite = playersprite.sprite;//给贴图赋值
transform.position = player.position;
transform.localScale = player.localScale;
transform.rotation = player.rotation;//把位置 旋转 大小缩放都同步
activestart = Time.time;//实时记录开始的时间
}
private void Update()
{
alpha = alpha * alphamul;//alpha乘以倍率 缩小(残影的不透明度越来越大)
color = new Color(1, 1, 1, alpha);
thissprite.color = color;//上边的color
if(Time.time>activestart+ activetime)
{
//返回对象池
shadowpool._instance.returnpool(this.gameObject);//这句是对象池中我们写的方法
}
}
我的注释可以说非常明确
我们在unity中创建一个空物体 然后挂在上这个脚本
然后赋值 做成预制体
大家可以参考我的赋值去赋值
然后就到了对象池这里
public static shadowpool _instance;//单例
public GameObject shadowprefebs;//预制体
public int shadowcount;//数量
private Queue<GameObject> availableObjects = new Queue<GameObject>();
private void Awake()
{
_instance = this;
//初始化对象池
GetFormPool();
}
public void FillPool()
{
//填满池子
for(int i = 0; i < shadowcount; i++)
{
var newshadow = Instantiate(shadowprefebs);
newshadow.transform.SetParent(transform);
//取消启用 返回对象池
returnpool(newshadow);
}
}
public void returnpool(GameObject gameObject )
{
gameObject.SetActive(false);
availableObjects.Enqueue(gameObject);//添加到队列的末端
}
public GameObject GetFormPool()
{
if(availableObjects.Count == 0)
{
//填充池子
FillPool();
}
var outshadow = availableObjects.Dequeue();//从开头获得一个
outshadow.SetActive(true);//启动enable中的方法
return outshadow;
}
注释同样很明确
在unity上创建一个空物体 然后挂上去赋值
其中的shadow是哪个预制体
然后就是改角色控制器的脚本
我也不知道大家所用的控制器的脚本
我给出我的添加的代码
[Header("冲锋参数")]
public float dashTime;//冲锋时间
private float dashTimeleft;//剩余时间
public float dashspeed;//冲锋的速度(原来为1 冲锋为2)
private float lastdashtime=-10;//上次冲锋的时间
private float dashCD;//CD时间
public void readytodash()
{
//冲锋
isdash = true;
dashTimeleft = dashTime;
lastdashtime = Time.time;
}
private void dash()
{
if (isdash)
{
if (dashTimeleft > 0)
{
dashspeed = 2;
dashTimeleft -= Time.deltaTime;
shadowpool._instance.GetFormPool();
}
else
{
isdash = false;
dashspeed = 1;
}
}
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.J ))
{
if(Time.time>=lastdashtime+dashCD)
{
//可以冲锋了
readytodash();
}
}
}
然后在unity中就可以运行了