当前位置: 首页 > news >正文

学习游戏制作记录(实现震动效果,文本提示和构建游戏)9.13

1.实现屏幕的震动效果

为玩家添加Cinemachine Impulse Source 组件

EntityFX脚本:

    [Header("Screen Shader FX")]
private CinemachineImpulseSource screenShake;//Start中自行获取对应组件
[SerializeField] private float shakeMutiplier;//震动倍率
public Vector3 shakeSwordImpact;//接剑时的震动方向
public Vector3 shakeHighDamage;//受到高伤害的

    public void ScreenShake(Vector3 _shakePower)
{
screenShake.m_DefaultVelocity = new Vector3(_shakePower.x * player.facingDir, _shakePower.y) * shakeMutiplier;//设置震动方向

        screenShake.GenerateImpulse();//产生震动
}

PlayerCatchSwordState脚本:

    public override void Enter()
{
base.Enter();

        sword = _Player.sword;

        _Player.entityFX.PlayDustFX();

        _Player.entityFX.ScreenShake(_Player.entityFX.shakeSwordImpact);//进入接剑状态的时候产生震动

PlayerStats脚本:

    protected override void DecreaseHealth(int _damage)
{
base.DecreaseHealth(_damage);

        if(isDead)
{
return;
}

        if(_damage>GetMaxHealth()*.3f)
{
player.SetupKnockBackPower(new Vector2(10, 6));

            player.entityFX.ScreenShake(player.entityFX.shakeHighDamage);//受到超高伤害时产生震动

            int randomSound = Random.Range(34, 35);
AudioManager.instance.PlaySFX(randomSound, null);
}

        ItemData_Equipment itemData_Armor = Inventory.instance.GetEquipment(EquipmentType.Armor);

        if(itemData_Armor != null)
{
itemData_Armor.Effect(player.transform);
}
}

2.实现文本的弹出

创建一个文本

创建PopUpTextFx脚本并挂载:

    private TextMeshPro myText;//获取文本

    [SerializeField] private float speed;//上升速度
[SerializeField] private float desappearSpeed;//消失速度
[SerializeField] private float colorDesappearSpeed;//变透明的速度

    [SerializeField] private float lifeTime;//生命周期

    private float textTimer;//计时器

    void Start()
{
myText = GetComponent<TextMeshPro>();
textTimer = lifeTime;
}

    void Update()
{
transform.position = Vector2.MoveTowards(transform.position,new Vector2(transform.position.x, transform.position.y + 1), speed * Time.deltaTime);//文本的上升
textTimer -= Time.deltaTime;

        if(textTimer < 0)
{
float alpha=myText.color.a-colorDesappearSpeed*Time.deltaTime;//实现文本的消失

            myText.color =new Color(myText.color.r,myText.color.g,myText.color.b,alpha);

            if (myText.color.a < 50)
speed = desappearSpeed;//透明下降到一定程度开始消失

            if(myText.color.a<=0)
Destroy(gameObject);
}

    }

EntityFX脚本:


  [Header("Pop Up Text")]
[SerializeField] private GameObject PopUpTextPrefab;//弹出文本预制体

    public void CreatePopUpText(string _text,Color _color)//传入文本和颜色
{
float randomX = Random.Range(-1, 1);
float randomY = Random.Range(3, 5);

        Vector3 positionOffest=new Vector3(randomX, randomY, 0);//偏移量

        GameObject newText =Instantiate(PopUpTextPrefab,transform.position+positionOffest,Quaternion.identity);//生成

        newText.GetComponent<TextMeshPro>().text= _text;//设置文本和颜色
newText.GetComponent <TextMeshPro>().color= _color;

    }

Skill脚本:

    public virtual bool CanbeUsed()
{
if (coolDownTime < 0)
{
UseSkill();
coolDownTime = cooldown;
return true;
}

        else
{
player.entityFX.CreatePopUpText("技能在冷却", Color.white);//除黑洞外添加冷却的文本提示
return false;
}
}

PlayerGroundedState脚本:


if(Input.GetKeyDown(KeyCode.R)&&_Player.skill.blackhole.BlackholeUnlocked)
{
if( _Player.skill.blackhole.coolDownTime > 0)
{
_Player.entityFX.CreatePopUpText("技能在冷却", Color.white);
return;//为黑洞添加提示
}
_PlayerStateMachine.ChangeState(_Player.blackholeState);
}

CharactorState脚本:

    protected virtual void  DecreaseHealth(int _damage,Color _color)
{
if(isVolunerable)
{
_damage = Mathf.RoundToInt(_damage * 1.1f);
}


        currentHealth -= _damage;

        if(_damage>0)
{
entityFX.CreatePopUpText(_damage.ToString(),_color);//提示伤害的数值,自行为燃烧伤害设置为红色字体

}

        if(onHealthChange != null)
{
onHealthChange();
}
}

3.构建游戏

ItemData脚本:


#if UNITY_EDITOR
using UnityEditor;
#endif//确保只在Unity编辑器中使用

Inventory脚本:


  public List<ItemData> ItemDataBase;//数据库

    public void LoadDate(GameData gameData)
{
foreach (KeyValuePair<string, int> pair in gameData.Inventory)
{
foreach (var item in ItemDataBase)//读取数据库
{
if (item != null && item.ItemID == pair.Key)
{
InventoryItem itemToLoad = new InventoryItem(item);

                    itemToLoad.stackSize = pair.Value;

                    LoadedItems.Add(itemToLoad);
}
}
}

        foreach (string loadedItemID in gameData.equipmentId)
{
foreach (var item in ItemDataBase)
{
if (item != null && item.ItemID == loadedItemID)
{
loadedEquipments.Add(item as ItemData_Equipment);
}
}
}
}

    #if UNITY_EDITOR

    [ContextMenu("Fill up Item data Base")]//只在Unity编辑器中使用下面的功能
private void FillupItemDataBase()=> ItemDataBase=new List<ItemData>(GetItemDataBase());
private List<ItemData> GetItemDataBase()
{
List<ItemData> itemDatas = new List<ItemData>();
string[] assestsName = AssetDatabase.FindAssets("", new[] { "Assets/Data/Items" });

        foreach (string SQName in assestsName)
{
var SQpath = AssetDatabase.GUIDToAssetPath(SQName);
var itemData = AssetDatabase.LoadAssetAtPath<ItemData>(SQpath);

            itemDatas.Add(itemData);
}

        return itemDatas;
}
#endif


文章转载自:

http://vzvSpAly.dsprL.cn
http://6858MYIw.dsprL.cn
http://DLAvwAP1.dsprL.cn
http://MQgyxStW.dsprL.cn
http://LVcwWlJ5.dsprL.cn
http://spKDmFQu.dsprL.cn
http://VsOPVGwl.dsprL.cn
http://xeViDaiG.dsprL.cn
http://aSBvd4ol.dsprL.cn
http://xE9B1FK4.dsprL.cn
http://KjScVFg2.dsprL.cn
http://sP4dVYpV.dsprL.cn
http://fN2bOgur.dsprL.cn
http://Dl5gKkYw.dsprL.cn
http://419PnoUL.dsprL.cn
http://o8RJFSn5.dsprL.cn
http://9WMipM9Y.dsprL.cn
http://C1jf48tl.dsprL.cn
http://8iP0VWxc.dsprL.cn
http://gMOV6sbA.dsprL.cn
http://uC9G4t9p.dsprL.cn
http://yvB4yoCQ.dsprL.cn
http://komPqIuw.dsprL.cn
http://RvwAaXZF.dsprL.cn
http://bBabvE1p.dsprL.cn
http://T8dQapFN.dsprL.cn
http://6bXI9ddM.dsprL.cn
http://mTVivWaw.dsprL.cn
http://9uS5z7q0.dsprL.cn
http://wcWytrLk.dsprL.cn
http://www.dtcms.com/a/381809.html

相关文章:

  • 【CMake】循环——foreach(),while()
  • 对比Java学习Go——函数、集合和OOP
  • AI时代的内容创作革命:深度解析xiaohongshu-mcp项目的技术创新与实战价值
  • 3-11〔OSCP ◈ 研记〕❘ WEB应用攻击▸存储型XSS攻击
  • 贪心算法应用:配送路径优化问题详解
  • 神经网络稀疏化设计构架中的网络剪枝技术:原理、实践与前沿探索
  • p5.js 绘制 3D 椭球体 ellipsoid
  • Qt中自定义控件的三种实现方式
  • leetcode34(环形链表)
  • Jupyter Notebook 介绍、安装及使用
  • 高并发场景下限流算法实践与性能优化指南
  • 基于stm32的智能井盖系统设计(4G版本)
  • 考研408计算机网络第36题真题解析(2021-2023)
  • 【Linux系统】单例式线程池
  • FreeSWITCH一键打包Docker镜像(源码编译)
  • POI和EasyExcel
  • 力扣-单调栈想法
  • 芯片厂常用的溶液—TMAH全方位介绍
  • Leetcode sql 50 ~5
  • 《大数据之路1》笔记2:数据模型
  • python小项目——学生管理系统
  • 格密码--从FFT到NTT(附源码)
  • HTML中css的基础
  • 软考中级习题与解答——第六章_计算机硬件基础(2)
  • UDP 深度解析:传输层协议核心原理与套接字编程实战
  • MySQL在Ubuntu 20.04 环境下的卸载与安装
  • 相机几何 空间点到像素平面转换
  • 基础算法模板
  • 智能学习辅助系统-部门管理开发
  • 01数据结构-初探动态规划