您的位置:首页 > 其它

角色技能攻击范围点区域显示

2014-05-27 23:21 519 查看
游戏开发中,经常会遇到释放大范围的角色技能AOE的情况,例如war3的大法师的暴风雪。如下图


在技能释放之前一般都会做一个圆形,扇形或者矩形的攻击范围提示。做这种图形一般是美术在3dmax或者maya下做好模型,导出fbx格式供程序调用。而本文给出一种在u3d下用程序动态生成的解决方案。

As we know, 不管是多么复杂的3D模型都是由多个三角形组成,所以圆形也不例外。如下图



根据极限逼近,Angle_step划分得越小,由三角形组成的圆形就越逼近实际的圆形。由此我们可以把三角形的所有顶点通过遍历记录下来,得到Vertex数组,然后用再组合成索引三角形,最后赋值给mesh

源程序如下

using UnityEngine;
using System.Collections;
using System;

public class WinterCircle : MonoBehaviour
{
private GameObject pp;
void Start ()
{
GameObject m_circle = new GameObject();
m_circle.name = "mCircle";
pp = GameObject.Find("pp");
MeshFilter filter = m_circle.AddComponent<MeshFilter>();
m_circle.AddComponent<MeshRenderer>();
DrawCircle(m_circle, filter, 20, 150);
}
/// <summary>
/// 生成扇形函数
/// </summary>
/// <param name="canvas">圆心的GameObject</param>
/// <param name="filter"></param>
/// <param name="raidus">半径</param>
/// <param name="angle">圆心角</param>
private void DrawCircle(GameObject canvas, MeshFilter filter, float raidus, float angle)
{
int ANGLE_STEP = 15;
var mesh = new Mesh();
int len = (int)Math.Floor(angle / ANGLE_STEP);
len = len + 2;
Vector3[] vs = new Vector3[len];
//第一个为圆心

Matrix4x4 m = pp.transform.localToWorldMatrix;
Debug.Log(m.ToString());

/*
* 1 0 0 1
* 0 1 0 2
* 0 0 1 3
* 0 0 0 0
*/

Vector3 v0 = new Vector3(m.m03, m.m13, m.m23);
vs[0] = v0;
for (int i = 1; i < len; i++)
{
canvas.transform.position = v0;
canvas.transform.rotation = pp.transform.rotation;
if (i != len - 1)
{//非最后一个点
canvas.transform.Rotate(new Vector3(0, ANGLE_STEP * (i - 1), 0));
var v = canvas.transform.position + canvas.transform.forward * raidus;
vs[i] = v;
}
else
{//最后一个顶点
canvas.transform.Rotate(new Vector3(0, angle, 0));
var v = canvas.transform.position + canvas.transform.forward * raidus;
vs[i] = v;
}
}
//三角形数
int tc = (int)Math.Floor(angle / ANGLE_STEP);
int[] triangles = new int[tc * 3];
for (int j = 0; j < tc; j++)
{
triangles[j * 3] = 0;
triangles[j * 3 + 1] = j + 1;
triangles[j * 3 + 2] = j + 2;
}
canvas.transform.position = v0;
canvas.transform.rotation = pp.transform.rotation;
mesh.vertices = vs; //顶点Vertex数组
mesh.triangles = triangles; //三角形数组
filter.mesh = mesh;
}
}


场景的GameObject

最后程序运行的结果,这里没有给MeshFilter赋材质,所以看起来是缺失材质的效果,不在本例的重点中。

同样,可以用程序作出矩形的攻击范围效果,矩形比圆形要简单,只需要两个三角形即可,注意顶点的组合顺序就没问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息