unity半月学习总结

 AnimationCurve

学习和参考

unity动画曲线调整跳跃手感_哔哩哔哩_bilibili

AnimationCurve_some animation curves tangents type to user to ens-CSDN博客

AnimationCurve - Unity 脚本 API

对于AnimationCurve Unity官方文档给出的解释是:保存可随时间评估的 Keyframes(关键帧) 的集合。

AnimationCurve的使用

首先要在代码脚本里面申明一个AnimationCurve对象

public AnimationCurve animss;

保存代码后返回unity就会出现界面,如图

点开后为下图效果

在曲线任意位置双击可以添加新的关键点,也可以选择右键add key来添加新的关键点。

在关键点上右键会有edit key(编辑关键点),delete key(删除关键点)等等设置。

可以利用AnimationCurve对跳跃和攻击的手感进行优化,对动画的每个进行编辑。

Object Pool

学习和参考链接:

对象池(Object Pool) - 知乎 (zhihu.com)

对象池的介绍与使用-CSDN博客

02.Code代码部分_哔哩哔哩_bilibili

什么是对象池?

对象池,顾名思义就是一定数量的已经创建好的对象 (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

【Unity】如何编写长按跳跃_哔哩哔哩_bilibili

优化了跳跃。

了解了行为树,还没有代码实践。

学习单向平台的实现。

平台掉落还在学习阶段。

因为这周忙着计网实验和课程设计,学的东西不多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值