AnimationCurve
学习和参考
AnimationCurve_some animation curves tangents type to user to ens-CSDN博客
对于AnimationCurve Unity官方文档给出的解释是:保存可随时间评估的 Keyframes(关键帧) 的集合。
AnimationCurve的使用
首先要在代码脚本里面申明一个AnimationCurve对象
public AnimationCurve animss;
保存代码后返回unity就会出现界面,如图
点开后为下图效果
在曲线任意位置双击可以添加新的关键点,也可以选择右键add key来添加新的关键点。
在关键点上右键会有edit key(编辑关键点),delete key(删除关键点)等等设置。
可以利用AnimationCurve对跳跃和攻击的手感进行优化,对动画的每个进行编辑。
Object Pool
学习和参考链接:
对象池(Object Pool) - 知乎 (zhihu.com)
什么是对象池?
对象池,顾名思义就是一定数量的已经创建好的对象 (Object)的集合。 当需要创建对象时,先在池子中获取,如果池子中没有符合条件的对象,再进行创建新对象,同样,当对象需要销毁时,不做真正的销毁,而是将其setActive (false),并存入池子中。是游戏编程中非常常用的优化策略以及设计模式。
优点和缺点
在游戏开发中,我们常常会遇到频繁得创建和销毁大量相同对象的场景。如果我们不做任何的特殊处理,这种场景会出现两个性能问题——大量的内存碎片以及频繁的分配内存空间。对象池可以减少频繁创建和销毁对象带来的成本,实现对象的缓存和复用。
但是处于对象池中的对象生命周期要比普通的对象要长久。维持大量的对象也是比较占用内存空间的。所以通常情况下,我们需要控制对象池的大小如果对象池没有限制,可能导致对象池持有过多的闲置对象,增加内存的占用。如果对象池闲置过小,没有可用的对象时,会造成之前对象池无可用的对象时,再次请求出现的问题。
代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool : MonoBehaviour
{
public static ObjectPool instance;
public GameObject shadowPrefab;
public int shadowCount;
private Queue<GameObject> availableObjects = new Queue<GameObject>();
private void Awake()
{
instance = this;
//初始化对象池
FillPool();
}
public void FillPool()
{
for(int i = 0; i < shadowCount; i++)
{
var newShadow = Instantiate(shadowPrefab);
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);
return outShadow;
}
}
利用对象池实现冲刺残影
using System.Collections;
using System.Collections.Generic;
using System.Drawing.Printing;
using UnityEngine;
public class Shadow : MonoBehaviour
{
private Transform player;
private SpriteRenderer thisSprite;
private SpriteRenderer playerSprite;
private Color color;
[Header("时间控制参数")]
public float activeTime;//显示时间
public float activeStart;//开始显示的时间点
[Header("不透明度的控制")]
public float alpha;
public float alphaSst;//初始值
public float alphaMultiplier;//变量系数
private void OnEnable()
{
player = GameObject.FindGameObjectWithTag("Player").transform;
thisSprite = GetComponent<SpriteRenderer>();
playerSprite = player.GetComponent<SpriteRenderer>();
alpha = alphaSst;
thisSprite.sprite = playerSprite.sprite;
transform.position =player.position;
transform.localScale=player.localScale;
transform.rotation =player.rotation;
activeStart =Time.time;
}
void FixedUpdate()
{
alpha *= alphaMultiplier;
color = new Color(0.5f, 0.5f, 1, alpha);
thisSprite.color = color;
if(Time.time >= activeStart + activeTime)
{
//返回对象池
ObjectPool.instance.ReturnPool(this.gameObject);
}
}
}
实现效果:
对冲刺代码进行优化
添加的代码:
//在冲刺期间对上下的移动进行约束
rb.constraints = ~RigidbodyConstraints2D.FreezePositionX;//锁定Y轴和旋转
rb.constraints = RigidbodyConstraints2D.FreezeRotation;//更新约束为只锁定旋转
//冲刺无敌
isinvulnerable=false;
other.GetComponent<PlayerController>()?.BoolSprint(this);
if(!isinvulnerable)
other.GetComponent<Character>()?.TakeDamage(this);
重写的荆棘的攻击效果
将触碰荆棘 受伤+被击退的设计改成了触碰荆棘回到安全点+扣20%血量。
将落水死亡代码移除。
实现类银快乐跳跳乐。
地图的设计规划
视频学习进度
唐老狮的视频C#看完了,unity入门视频刚刚开始五六个。
麦口勇士传说更上更新进度了,学了对话和残影。
学了些奇奇怪怪的视频
Unity教程:2D横版移动跳跃完美手感(终极版/可多段跳)必看!_哔哩哔哩_bilibili
优化了跳跃。
了解了行为树,还没有代码实践。
学习单向平台的实现。
平台掉落还在学习阶段。
因为这周忙着计网实验和课程设计,学的东西不多。