前言
眾所周知泪姨,2016年對“陰陽師”而言是不一樣的一年虐译。作為網(wǎng)易在第三季度推出的新游,創(chuàng)新地將原汁原味的和風(fēng)美學(xué)體驗帶給用戶捂龄,獲得了超出預(yù)期的市場反應(yīng)。9月2日首發(fā)當(dāng)天即獲App Store編輯選薦加叁,更在12月發(fā)布的App Annie中國區(qū)2016年度十佳游戲中占據(jù)一席之地倦沧。10月初它匕,其中文版在全球多個國家的蘋果應(yīng)用商店上架展融,根據(jù)11月11日首部資料片上線時的App Annie數(shù)據(jù),《陰陽師》獲得極具突破的矚目和成績:中國免費榜第1豫柬、暢銷榜第1告希,加拿大暢銷榜第1,澳大利亞暢銷榜第1烧给,新西蘭暢銷榜第1燕偶,英國暢銷榜第8,美國暢銷榜第10等等傲人的成績础嫡。
作為其中的核心玩法-畫符指么,是其受到眾多玩家青睞的重大原因。
本篇將告訴你怎么在Unity3D中怎么實現(xiàn)這一效果榴鼎。
思路伯诬?
如何實現(xiàn)在屏幕上畫東西?
- Unity內(nèi)置的LineRenderer
- Shader
- 這里我們選擇用OpenGL來實現(xiàn)巫财。
在官方幫助文檔里面盗似,我們可以找到GL這個API。
代碼實現(xiàn)
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
public void GenerateText()
{
Texture2D tmpTex = new Texture2D(300,400);
for (int i = 1; i < allPoints.Count; i++)
{
Vector2 tmpFront = allPoints[i - 1];
Vector2 tmpBack = allPoints[i];
for (int j = 1; j < 100; j++)
{
int xx = (int)(Mathf.Lerp(tmpFront.x * tmpTex.width, tmpBack.x*tmpTex.width, j / 100f));
int yy = (int)(Mathf.Lerp(tmpFront.y * tmpTex.height, tmpBack.y * tmpTex.height, j / 100f));
tmpTex.SetPixel(xx, yy, Color.yellow);
}
}
tmpTex.Apply();
GetComponent<Renderer>().material.mainTexture = tmpTex;
}
static Material lineMaterial;
static void CreateLineMaterial()
{
if (!lineMaterial)
{
// Unity has a built-in shader that is useful for drawing
// simple colored things.
Shader shader = Shader.Find("Hidden/Internal-Colored");
lineMaterial = new Material(shader);
lineMaterial.hideFlags = HideFlags.HideAndDontSave;
// Turn on alpha blending
lineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
lineMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
// Turn backface culling off
lineMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off);
// Turn off depth writes
lineMaterial.SetInt("_ZWrite", 0);
}
}
// Will be called after all regular rendering is done
public void OnRenderObject()
{
CreateLineMaterial();
// Apply the line material
lineMaterial.SetPass(0);
GL.PushMatrix();
// Set transformation matrix for drawing to
// match our transform
GL.MultMatrix(transform.localToWorldMatrix);
// Draw lines
GL.Begin(GL.LINES);
// 將透視投影變成正交投影
GL.LoadOrtho();
GL.Color(Color.yellow);
for (int i = 1; i < allPoints.Count; i++)
{
Vector2 tmpFront = allPoints[i-1];
Vector2 tmpBack = allPoints[i];
GL.Vertex3(tmpFront.x, tmpFront.y, 0);
GL.Vertex3(tmpBack.x, tmpBack.y, 0);
}
GL.End();
GL.PopMatrix();
}
List<Vector2> allPoints = new List<Vector2>();
private void Update()
{
if (Input.GetMouseButton(0))
{
Vector2 tmpPos = Camera.main.ScreenToViewportPoint(Input.mousePosition);
allPoints.Add(tmpPos);
}
if (Input.GetMouseButtonUp(0))
{
GenerateText();
//清空屏幕上的點
allPoints.Clear();
}
}
}