<独家>DunkingBall的项目代码块知识点细节汇总(杂)

19 篇文章 0 订阅
13 篇文章 3 订阅

<独家>DunkingBall的项目代码块知识点细节汇总(杂)<2017/11/17>

<一>.滤镜的使用,自制脚本,可移植性极强:

预先添加对应的组件(此时不激活,等待脚本激活)到摄像机上


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CameraColorfulStyle : MonoBehaviour
{
    public Button CameraStyleChange;
    public Text ShowStyleName;
    public List<MonoBehaviour> Colorfuls;
    public string[] ColorfulNames;
    public Dictionary<string, MonoBehaviour> ColorfulsBook;
    private int temp = 0;
    // Use this for initialization
    void Start()
    {
        ColorfulNames = new string[10] { "正常", "老电视", "故障", "梦境", "高温", "高斯模糊", "漫画书", "半色调", "LoFi调色板", "画笔" };
        ColorfulsBook = new Dictionary<string, MonoBehaviour>();
        CameraStyleChange.onClick.AddListener(ChangeStyle);
        Colorfuls.Add(null);
        Colorfuls.Add(transform.GetComponent<Colorful.AnalogTV>());//老电视
        Colorfuls.Add(transform.GetComponent<Colorful.Glitch>());//毛刺
        Colorfuls.Add(transform.GetComponent<Colorful.WaveDistortion>());//梦境
        Colorfuls.Add(transform.GetComponent<Colorful.Wiggle>());//高温
        Colorfuls.Add(transform.GetComponent<Colorful.GaussianBlur>());//高斯模糊
        Colorfuls.Add(transform.GetComponent<Colorful.ComicBook>());//漫画书
        Colorfuls.Add(transform.GetComponent<Colorful.Halftone>());//半色调
        Colorfuls.Add(transform.GetComponent<Colorful.LoFiPalette>());//LoFi调色板
        Colorfuls.Add(transform.GetComponent<Colorful.Strokes>());//画笔
        for (int i = 0; i < Colorfuls.Count; ++i)
        {
            ColorfulsBook.Add(ColorfulNames[i], Colorfuls[i]);
            //print(ColorfulNames[i] + Colorfuls[i]);
        }
    }

    public void ChangeStyle()
    {
        ShowStyleName.text = ColorfulNames[temp % Colorfuls.Count];
        //如果左侧为空,我们直接跳过不管它
        if (ColorfulsBook[ColorfulNames[(temp + Colorfuls.Count - 1) % Colorfuls.Count]] == null) { }
        else { ColorfulsBook[ColorfulNames[(temp + Colorfuls.Count - 1) % Colorfuls.Count]].enabled = false; }
        //如果当前为空,我们直接++跳出然后进入下一个
        if (ColorfulsBook[ColorfulNames[temp % Colorfuls.Count]] == null) { temp++; return; }
        else { ColorfulsBook[ColorfulNames[temp % Colorfuls.Count]].enabled = true; temp++; }//注意这个地方有坑,千万不要在前面++temp,否则直接炸车
    }
}
然后差不多这个效果:

<二>.开场动画(DOTween),移除<DOTweenAnimation>组件动画的方法(DOTweenPro),换皮肤功能(Resources.Load)

void StartGame()
    {
        //球一开始是锁定移动位置的,然后出场动画是球解除刚体的位置锁定,然后摄像机Size体积变大(为了装逼,效果不错)

        ball.GetComponent<DOTweenAnimation>().tween.Kill();//此行命令能直接砍掉 DOTween Pro 中<DOTweenAnimation>的使用
        pauseCanvas.SetActive(true);
        mainCamera.DOOrthoSize(5, 0.75f);//使用DOTween调整相机的大小
        mainCamera.transform.DOMoveY(1, 1f);//移动摄像机的Y轴一秒内到指定值1
        SGame.transform.root.gameObject.SetActive(false);
        scoreCanvas.SetActive(true);
        ball.GetComponent<Rigidbody2D>().constraints = ~RigidbodyConstraints2D.FreezePosition;//对刚体的移动锁定进行取反
    }

    public void QuitGame()
    {
        Application.Quit();//不解释,游戏退出
    }
    public void SkinChange()
    {
        //下面是使用Resources.Load进行资源的读取加载(这是我做的换皮功能核心代码)
        ball.GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>("Balls/ball_" + (skinNumber % 45).ToString());
        skinNumber++;
    }
开场动画和换肤效果如下,哈哈:

<三>.添加音效,给小球施加力量或速率(设限),通过代码修改对象的Layer层(注意有坑!)

	//下面这个用来添加音效,然后一秒后进行删除
	var effectIstance = Instantiate(releaseBallSound[Random.Range(0, 3)], transform.position, new Quaternion()) as GameObject;
	Destroy(effectIstance, 1f);
                        
	//你可以通过AddForce给刚体施加力
	//ballDown.GetComponent<Rigidbody2D>().AddForce(transform.root.up.normalized * (Mathf.Clamp(start2end_Length, 0, 10)), ForceMode2D.Impulse);
	//你也可以通过velocity给物体添加一个速率(主动设置velocity为0时,物体会立即停止)  transform.up获取物体本地up方向的世界坐标
	ballDown.GetComponent<Rigidbody2D>().velocity = (Vector2)(transform.root.up.normalized * Mathf.Clamp(start2end_Length * 5.3f, 3, 30));
                        
	//transform.root.gameObject.layer = LayerMask.NameToLayer("IgnoreBasket");//这个方法可以直接改变代码的层级,但是有坑!!!!!!(忽略碰撞这一块无效,目前尚无时间研究)

<四>.关于Collider2D的一些坑爹玩意儿

下面这个是false掉篮框的所有碰撞器
//是的,你没有看错,当初我天真的以为用Collider2D搞定一切,然后我被整了(Collider2D虽然是其他Collider2D的基类,但是你把这个false并没有任何卵用,你得手动干掉所有的指定Collider组件)
                        transform.root.GetChild(2).GetComponent<EdgeCollider2D>().enabled = false;
                        foreach (Collider2D c in transform.root.GetComponents<Collider2D>())
                        {
                            c.enabled = false;
                        }
                        foreach (CircleCollider2D cc in transform.root.GetComponentsInChildren<CircleCollider2D>())
                        {
                            cc.enabled = false;
                        }

下面这个是true开启篮框的所有碰撞器

		baskets[i].transform.GetChild(2).GetComponent<EdgeCollider2D>().enabled = true;
                foreach (Collider2D c in baskets[i].transform.GetComponents<Collider2D>())
                {
                    c.enabled = true;
                }
                foreach (CircleCollider2D cc in baskets[i].transform.GetComponentsInChildren<CircleCollider2D>())
                {
                    cc.enabled = true;
                }

<五>.DOTween序列Sequence进行对象整体淡出处理,透明度还原,欧拉角转四元数

下面是通过DOTween动画的序列Sequence来进行对象的整体淡出处理:
	Sequence fadeSelf = DOTween.Sequence();
        SpriteRenderer[] sprites = T.gameObject.GetComponentsInChildren<SpriteRenderer>();
        for (int i = 0; i < sprites.Length; ++i)
        {
            fadeSelf.Join(sprites[i].material.DOFade(0, 1f));
        }
        fadeSelf.Join(T.DOPunchPosition(new Vector3(-transform.up.x + 0.3f, -transform.up.y + 0.3f, -transform.up.z), 0.03f, 1, 0.03f));
        fadeSelf.Play().OnComplete(() => T.root.gameObject.SetActive(false));//运行结束后将自己root根对象false掉(淡出)
下面是将对象的透明度全部还原:

 		//获取对象身上所有的SpriteRenderer然后将它们的material.color透明度还原
                SpriteRenderer[] sprites = baskets[i].GetComponentsInChildren<SpriteRenderer>();
                for (int m = 0; m < sprites.Length; ++m)
                {
                    sprites[m].material.color = new Color(1, 1, 1, 1);
                }
                //下面这几行跟对象池物体的位置生成以及角度有关
                Vector3 tempP = baskets[(i + baskets.Length - 1) % baskets.Length].transform.position;//将GameObject[]中当前物体右侧的对象tmepP坐标拿到
                baskets[i].transform.position = new Vector3(tempP.x + 7, Random.Range(-1.1f, 2.1f), 0);//物体此时的位置在该对象tempP固定右方一点,然后高度随机
                baskets[i].transform.rotation = Quaternion.Euler(new Vector3(0, 0, Random.Range(-10, 37)));//欧拉角转四元数(欧拉角负数右转,正数左转)







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值