Wdream

Personal Website

The Sky's The Limit.


Unity 2D 问题总结

目录

Unity 2D 问题总结

人物穿过地面下坠

人物需要包含组件

  1. RigidBody 2D
  2. Box Collider 2D (最好使用Capsule Collider 2D)

image-20250227101027270

地面需要包含组件

  1. Tilemap Collider 2D

image-20250227101158194

人物水平移动卡住

因为使用了矩形的碰撞箱,对Tilemap的碰撞产生了问题,替换为胶囊形的即可。

人物需要包含组件

  1. RigidBody 2D
  2. 使用Capsule Collider 2D

人物倒地

RigidBody 2D > Freeze Z锁定Z轴

动画不会立即过渡

将过渡箭头的退出时间取消

image-20250301233059787

人物爬墙动画相反

在墙上滑行的时候,逻辑朝向是面向墙的,动画朝向是背向墙面的

如果出现人物面向墙面,说明上墙的时候人物的朝向为背向墙面的,只要此时不让人物上墙即可

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的层级设置为对应的层级

image-20250318212103453

image-20250318212125683

image-20250318211915537

人物闪烁效果

新建 > Material

image-20250318215205487

新建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身上

image-20250319104632401

修改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

image-20250326145909032

注意修改时需要勾选,否则assets中的prefabs也会被取消,修改完之后可以取消勾选,防止出现在场景中影响视野。

image-20250328210945392

引用参数异常

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是灰色的,无法点击

image-20250411100201940

选中需要裁剪的图像,将Spirte Mode设置为Multiple

image-20250411100259266

Unity序列帧图偏移

需要调整裁剪尺寸

image-20250405103918181

image-20250405103838396

Unity导入素材模糊

unity默认压缩素材,需要调节参数,选中素材,主要调节Max Size

image-20250405103307085

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序列帧图偏移

分辨率,压缩Unity导入素材模糊

UI血条

创建 > UI > image

image-20250409200715520

相对屏幕位置

image-20250409222945798

Unity发病

重启即可

image-20250414221457298

管理器空引用

image-20250414232717151

大概率是配置表写到了场景里的预制体而不是文件里的,场景里的已经被注释了,所以空引用

image-20250414232649079

Button显示特性冗余

新建Canvas后UI交互失效

需要添加Graphic Raycaster

image-20250503201534990

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

image-20250511203914835

Comments