<独家>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)));//欧拉角转四元数(欧拉角负数右转,正数左转)