unity
未读土狼时间人物在地面/平台边缘即将掉落的时候,仍有机会进行跳跃动作;
其原理是:在人物掉落判定时开始计时,在设置的土狼时间内,可以按键跳跃。
新建一个状态脚本PlayerState_CoyoteTime,大部分代码可复制PlayerState_Run。
从RUN状态转向CoyoteTime,首先关闭刚体重力(需要在PlayerController脚本中添加方法获取参数),使角色在空中保持一段时间。状态结束再开启刚体重力。
其中包含的下落状态处理逻辑,因此可以将PlayerState_Run中浮空切换下落状态改为切换为PlayerState_CoyoteTime
PlayerState_CoyoteTime.cs代码
using System.Collections;using System.Collections.Generic;using UnityEngine;[CreateAssetMenu(menuName = "Data/StateMachine/PlayerState/CoyoteTime", fileName = "PlayerS ...
unity
未读
总章中间漏了点,最近懒得补。干脆做到哪写到哪吧,有时间再整理。
跳跃在空中的状态是:跳起->下落;
跳起之后松开空格就是下落状态,所以二段跳逻辑我们写在下落状态中;
实现空中多段跳
新建一个空中跳跃状态(PlayerState_AirJump.cs),为他添加资产菜单(CreateAssetMenu);
空中跳跃的逻辑和普通跳跃一样,所以直接复制代码即可。重要的地方在于,我们需要给二段跳进行限制。
在PlayerController.cs中,新建属性CanAirJump,public bool CanAirJump { get; set; } = true;//控制空中跳跃能力的开关
在下落状态脚本PlayerState_Fall.cs中的**LogicUpdate()**函数里实现判断,当玩家可以跳跃时(吃到星星,测试时条件是落地后)切换状态:
public override void LogicUpdate() { if (player.IsGrounded) {//当玩家接触到地面时,切换到落地状态 ...
unity
未读Invoke方法是Unity3D 中的一种委托机制。现在看一下官网给出的API:
public void Invoke(string methodName, float time);
methodName 是方法名,time 是具体几秒
Invokes the method methodName in time seconds.
在具体事件以后调用这个方法
也就是说,Invoke(“SendMessage”,5) ,表示的是在“5s”以后执行“SendMessage”方法。
使用Invoke方法需要注意以下三点:
1、它应该在Start,Update,FixUpdate,LateUpdate,还有OnGUI中被调用
2、Invoke中传递的方法不能是含有参数的方法、
3、当Time.ScaleTime = 0时,Invoke()无效,调用不到Invoke方法
当然,Invoke也支持重复调用:
InvokeRepeating(“SendMessage”,2,3);
表示在“2s”以后开始调用第一次,之后每隔“3s”重复调用一次。
什么是正则表达式?
正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。
一个正则表达式是一种从左到右匹配主体字符串的模式。“Regular expression”这个词比较拗口,我们常使用缩写的术语“regex”或“regexp”。正则表达式可以从一个基础字符串中根据一定的匹配模式替换文本中的字符串、验证表单、提取字符串等等。
想象你正在写一个应用,然后你想设定一个用户命名的规则,让用户名包含字符、数字、下划线和连字符,以及限制字符的个数,好让名字看起来没那么丑。我们使用以下正则表达式来验证一个用户名:
以上的正则表达式可以接受 john_doe、jo-hn_doe、john12_as。但不匹配Jo,因为它包含了大写的字母而且太短了。
目录
1. 基本匹配
2. 元字符
2.1 点运算符 .
2.2 字符集
2.2.1 否定字符集
...
ScriptableObject平时开发存在的一些问题:
一个场景内有多个相同组件使用相同数值的时候,这个组件也在内存中多了一份实例,浪费内存空间。
static或者[Serializable]修饰的变量,在程序退出后会还原。编辑器模式运行时,只能通过Copy Component Values来临时保存调整好的数值。
项目之间、场景之间数据很难共享。
在runtime下要改变某个GameObject上组件的数值,就一定要获取到这个GameObject实例,使项目耦合度成倍提高,最后变成蜘蛛网。
场景中总会有一些空的GameObject用来保存和共享数据,这个GameObject基本不会参与太多的游戏逻辑,但为了保存和共享场景内的数据就不得不碍眼的在场景中出现,逼死强迫症,也不利于模块抽象。
同样,要通过UGUI Button中的On Click事件调用一个GameObject上的方法,也只能获取到GameObject实例来调用,数量太多的话也变成了蜘蛛网。
使用ScriptableObject如何解决
ScriptableObject是将数据存储在.asset文件中的,可 ...
unity
未读一、背景滚动实现方法
创建一个3d对象Quad,重命名为SimpleBackground,调整好大小(跟图片差不多大)
新建一个材质,设置shader为Unlit/Textu
将图片texture type设置为default,拖入材质。
将材质拖进SimpleBackground,这样就做好了背景。
通过实时更改材质中offset偏移值,来实现滚动效果
滚动代码如下:将Start()改为每帧刷新的协程(模拟Update())
Material material; [SerializeField] Vector2 scrollVelocity;//速度 void Awake() { material = GetComponent<Renderer>().material; } private IEnumerator Start() { while (GameManager.GameState != GameState.GameOver) //游戏状 ...
unity
未读slider.onValueChanged.AddListenerslider.onValueChanged.AddListener((float v) => {//v等价于slider.value AudioTuning.Instance.SetMasterVolume(v); });
AudioTuning:public class AudioTuning : SingLeton<AudioTuning>{ [SerializeField] AudioMixer audioMixer; public void SetMasterVolume(float volume) { audioMixer.SetFloat("MasterVolume", volume); }}
unity
未读
通过对象名称(Find方法)
GameObject.Find("name")
通过标签获取单个游戏对象(FindWithTag方法)
GameObject.FindWithTag("Tag");
通过标签获取多个游戏对象(FindGameObjectsWithTags方法)
通过类型获取单个游戏对象(FindObjectOfType方法)
通过类型获取多个游戏对象(FindObjectsOfType方法)
unity
未读参考项目:https://www.bilibili.com/video/BV15W411976h新加的功能1.怪物球自转
2.不同炮台只可在特定颜色,区域内建造。
3.未选中炮台不可建造
遇到的问题炮弹打中敌人之后发现后方的一个怪会持续扣血直到死亡。初步猜测是碰撞触发了多次,后来暂停看的时候发现,子弹爆炸特效(在子弹销毁时触发) 在敌人死亡的时候会一下子刷出特别多。因此我判断是子弹打入敌人之后没有实时销毁。运行一测,果然是。最后在子弹脚本中,释放子弹爆炸特效的前方增加了销毁自身的代码。修复了bug。
待续..