Unity 2D 问题总结
人物穿过地面下坠
人物需要包含组件
- RigidBody 2D
- Box Collider 2D (最好使用Capsule Collider 2D)
地面需要包含组件
- Tilemap Collider 2D
人物水平移动卡住
因为使用了矩形的碰撞箱,对Tilemap的碰撞产生了问题,替换为胶囊形的即可。
人物需要包含组件
- RigidBody 2D
- 使用Capsule Collider 2D
人物倒地
RigidBody 2D > Freeze Z锁定Z轴
动画不会立即过渡
将过渡箭头的退出时间取消
人物爬墙动画相反
在墙上滑行的时候,逻辑朝向是面向墙的,动画朝向是背向墙面的
如果出现人物面向墙面,说明上墙的时候人物的朝向为背向墙面的,只要此时不让人物上墙即可
if(player.GetWallDirection() * xInput > 0 && player.IsWallDetected() && !player.IsGroundedDetected(2.0f))
{
stateMachine.ChangeState(player.wallSlideState);
}
人物靠墙时,刚跳起就上墙
将此时的地面监测距离调高,可以重载原先的侦测函数,增加一个偏移量参数
public bool IsGroundedDetected(float offset)
{
//以groundCheck为中心,向下画一条长度为groundCheckRadius的线,如果碰到了地面,那么返回true
return Physics2D.Raycast(groundCheck.position, Vector2.down, groundCheckRadius+offset, whatIsGround);
}
if(player.GetWallDirection() * xInput > 0 && player.IsWallDetected() && !player.IsGroundedDetected(2.0f))
{
stateMachine.ChangeState(player.wallSlideState);
}
人物跳墙时会出现速度异常
因为人物跳墙时需要同时获得水平和纵向的速度,而这两个速度原先在Enter中一次性赋予了角色,在某些时候会出现问题——人物只获得了水平速度
解决办法是在Update中持续更新角色的速度
人物和怪物发生碰撞
人物可以踩在怪物头上以及可以推着怪物走。
Edit > Project Settings > Physics2D > 取消 Player 和 Enemy的碰撞
注意将Player和Enemy的层级设置为对应的层级
人物闪烁效果
新建 > Material
新建EntityFX 脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Script.Entity
{
public class EntityFX : MonoBehaviour
{
private SpriteRenderer sr;
[Header("Flash FX")]
[SerializeField]private Material hitMat;
private Material originalMat;
private void Start()
{
sr = GetComponentInChildren<SpriteRenderer>();
originalMat = sr.material;
}
private IEnumerator FlashFX()
{
sr.material = hitMat;
yield return new WaitForSeconds(0.3f);
sr.material = originalMat;
}
}
}
添加到Player/ Enemy身上
修改Entity方法Damage
using Unity.Mathematics;
using UnityEngine;
namespace Script.Entity
{
public class Entity : MonoBehaviour
{
#region Components
public EntityFX Fx { get;private set; }
#endregion
//...
protected virtual void Awake()
{
//获取组件
Fx = GetComponent<EntityFX>();
}
public void Damage()
{
//携程实现跨脚本调用方法
Fx.StartCoroutine("FlashFX");
Debug.Log(" i was Damaged");
}
}
}
预制体prefabs设置
创建
create -> scene -> prefab
注意修改时需要勾选,否则assets中的prefabs也会被取消,修改完之后可以取消勾选,防止出现在场景中影响视野。
引用参数异常
private void CheckToCloneAttack()
{
if (!canAttack) return;
var randomIndex = Random.Range(0, targetsList.Count);
var offsetX = Random.Range(0, 100) > 50f ? 0.9f : -1.1f;
var dir = offsetX > 0 ? -1 : 1;
//targets[randomIndex]是引用,不能直接传递,或者说传递了最好不要直接使用
SkillManager.Instance.Clone.CreatePrefabs(targetsList[randomIndex],dir,offsetX,0);
SetCloneAttackTimer(cloneAttackCoolDown);
attackAmount--;
}
如果非要传递,不要直接使用
public void CreatePrefabs(Transform newTf, int dir, float offsetX, float offsetY)
{
base.CreatePrefabs(prefab);
if (!prefabsController) return;
var clonePos = new Vector2(newTf.position.x + offsetX, newTf.position.y + offsetY);
((ClonePrefabsController)prefabsController).SetUpPrefabs(clonePos, duration, dir);
}
Spine序列帧导出
选中第一个动作作为基点(需要裁剪框够大),开启视区- 裁剪,后续的帧裁剪范围就一样了,不会发生偏移。
抗锯齿采样可选
Unity序列帧图无法裁剪
如图所示,slice是灰色的,无法点击
选中需要裁剪的图像,将Spirte Mode设置为Multiple
Unity序列帧图偏移
需要调整裁剪尺寸
Unity导入素材模糊
unity默认压缩素材,需要调节参数,选中素材,主要调节Max Size
Unity导入Spine序列帧步骤
获取skel png atlas 三件套,在各大git仓库可以获取,或者自行解包
注意Spine版本,在skel文件里可以看到,Spine的兼容性很差,几乎没有
先用[spine3.8.zip_免费高速下载 | 百度网盘-分享无限制](https://pan.baidu.com/s/1FAdPrcvJxtKJ4rVB0ZYheA?pwd=it96)把纹理解包成零件放在png文件夹,spine打开skel,图片选择png文件夹。Spine序列帧导出 |
用Images to Sprite Sheet Generator将帧合成为Sprite sheet
导入Unity调节
分辨率,压缩Unity导入素材模糊
UI血条
创建 > UI > image
相对屏幕位置
Unity发病
重启即可
管理器空引用
大概率是配置表写到了场景里的预制体而不是文件里的,场景里的已经被注释了,所以空引用
Button显示特性冗余
- 你导入了 UnityEngine.UIElements(UI Toolkit系统)
- 但你实际上可能在使用 UnityEngine.UI(传统UGUI系统)
新建Canvas后UI交互失效
需要添加Graphic Raycaster
TTF字体导入
右键点击TTF 文件
create > TextMeshPro > Font Assets > SDF
Button的Click事件无法序列化
如果制作了Prefab, 实例化化的时候Click事件会丢失
需要添加音效就要添加Asset的音频资源而不是场景中的物体,
但是音频资源好像没有播放的方法,只能通过实例化的时候同时添加事件监听
Button切换场景导致音频“失效”
因为切换了场景后音效就没法播放了,
需要协程拖延一段时间,确保音效播放完毕
Particle粒子系统
Stop之后无法Start,不知道为什么
换成Pause替代Stop
Scroll view 中 button无法点击
父级canvas group需要设置Blocks Raycasts
Comments