Unity 增加2D游戏的打击感笔记

1.玩家打击敌人产生底色的变换

效果原理是利用Shader来给敌人添加一个材质Material(材质),在受到来自伤害的碰撞时去改变底色的值,同时还有设置底色回复到原来颜色的时间。
设置两个float来控制底色的显示时间

   public float hurtLength;//显示时间
    private float hurtCounter;//计时器

在碰撞事件发生时改变shader中控制底色的值边1,也就是变成全白

sp.material.SetFloat("_FlashAmount", 1);

同时给计时器赋予显示时间的值,同时在update()中使得计数器时间每帧都在不断变小直到小于0,当小于0时就将控制底色的值变为0也就是恢复原色;

 hurtCounter = hurtLength;
   if (hurtCounter <= 0)
       {
           sp.material.SetFloat("_FlashAmount", 0);
       }
       else
           hurtCounter -= Time.deltaTime;

附上所用shader:

Shader "Sprites/DefaultColorFlash"
 {
     Properties
     {
         [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
         _Color ("Tint", Color) = (1,1,1,1)
         _FlashColor ("Flash Color", Color) = (1,1,1,1)
         _FlashAmount ("Flash Amount",Range(0.0,1.0)) = 0.0
         [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
     }
 
     SubShader
     {
         Tags
         { 
             "Queue"="Transparent" 
             "IgnoreProjector"="True" 
             "RenderType"="Transparent" 
             "PreviewType"="Plane"
             "CanUseSpriteAtlas"="True"
         }
 
         Cull Off
         Lighting Off
         ZWrite Off
         Fog { Mode Off }
         Blend One OneMinusSrcAlpha
 
         Pass
         {
         CGPROGRAM
             #pragma vertex vert
             #pragma fragment frag
             #pragma multi_compile DUMMY PIXELSNAP_ON
             #include "UnityCG.cginc"
             
             struct appdata_t
             {
                 float4 vertex   : POSITION;
                 float4 color    : COLOR;
                 float2 texcoord : TEXCOORD0;
             };
 
             struct v2f
             {
                 float4 vertex   : SV_POSITION;
                 fixed4 color    : COLOR;
                 half2 texcoord  : TEXCOORD0;
             };
             
             fixed4 _Color;
             fixed4 _FlashColor;
             float _FlashAmount;
 
             v2f vert(appdata_t IN)
             {
                 v2f OUT;
                 OUT.vertex = UnityObjectToClipPos(IN.vertex);
                 OUT.texcoord = IN.texcoord;
                 OUT.color = IN.color * _Color;
                 #ifdef PIXELSNAP_ON
                 OUT.vertex = UnityPixelSnap (OUT.vertex);
                 #endif
 
                 return OUT;
             }
 
             sampler2D _MainTex;
 
             fixed4 frag(v2f IN) : COLOR
             {
                 fixed4 c = tex2D(_MainTex, IN.texcoord) * IN.color;
                 c.rgb = lerp(c.rgb,_FlashColor.rgb,_FlashAmount);
                 c.rgb *= c.a;
             
                 return c;
             }
         ENDCG
         }
     }
 }
   

2.玩家打击敌人,敌人产生击退

同样在碰撞检测中调用。
获取碰撞时敌人和主角之间的方向向量,敌人的当前位置加上方向向量就实现了击退。

 Vector2 difference = other.transform.position - transform.position;
 other.transform.position = new Vector2(other.transform.position.x + difference.x
 , other.transform.position.y + difference.y);

3.玩家打击敌人,镜头震动

挺复杂的没看懂,直接附上代码(也是在碰撞检测中调用)

using System.Collections;
using UnityEngine;
public class CameraController : MonoBehaviour
{
public IEnumerator  CameraShake(float  _maxTime,float _amount)
    {
        Vector3 originalPos = transform.localPosition;
        float shakeTime = 0.0f;
        while (shakeTime < _maxTime)
        {
            float x = Random.Range(-1f, 1f) * _amount;
            float y = Random.Range(-1f, 1f) * _amount;
            transform.localPosition = new Vector3(x, y, originalPos.z);
            yield return  new WaitForSeconds(0f);
        }
    }
}

效果图:
在这里插入图片描述
学习的视频:https://www.bilibili.com/video/BV1qt4y1U7aS

发布了3 篇原创文章 · 获赞 8 · 访问量 1848

猜你喜欢

转载自blog.csdn.net/weixin_43821918/article/details/105432701