角色技能攻击范围点区域显示
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赋材质,所以看起来是缺失材质的效果,不在本例的重点中。
同样,可以用程序作出矩形的攻击范围效果,矩形比圆形要简单,只需要两个三角形即可,注意顶点的组合顺序就没问题了。
在技能释放之前一般都会做一个圆形,扇形或者矩形的攻击范围提示。做这种图形一般是美术在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赋材质,所以看起来是缺失材质的效果,不在本例的重点中。
同样,可以用程序作出矩形的攻击范围效果,矩形比圆形要简单,只需要两个三角形即可,注意顶点的组合顺序就没问题了。
相关文章推荐
- C# 计算游戏技能攻击区域
- 角色是否在扇形攻击范围
- iOS根据坐标数据点所在的坐标区域来动态显示到可视范围
- 【整理】关于角色攻击范围判定和攻击判定
- C# 计算游戏技能攻击区域
- Unity3D中人物角色被攻击变色,死亡渐隐消失,墙后显示的Shader
- MMO游戏技能攻击区域的计算2--给地图划分格子
- 人物角色群体攻击判定四(三角区域判断)
- iOS 百度地图 设置显示区域 中心点和范围
- iOS 百度地图 设置显示区域 中心点和范围
- MapView 百度地图 (锁定到以当前经纬度为中心点的显示区域和合适的显示范围 )
- 关于角色攻击范围判定和攻击判定
- iOS 计算所有标注的经纬度范围 来确定地图显示区域
- iOS根据坐标数据点所在的坐标区域来动态显示到可视范围
- Unity3D角色攻击范围判定和攻击判定
- MMO游戏技能攻击区域的计算3--效率分析
- vtk clamping 显示区域范围
- iOS根据坐标数据点所在的坐标区域来动态显示到可视范围
- MMO游戏技能攻击区域的计算
- 游戏服务端开发:如何精确计算MMO游戏技能攻击区域?