unity 战棋移动范围基础创建
1、在上一篇的基础上,创建一个小方块,来表现移动范围,我们给他加上box collider。
给我们的猪脚加上box collider。
将我们的背景层向后移动一些,因为素材z轴相同的话射线检测会出错。
这样前期就准备好了。


2、我们打开脚本就行编辑。完整的脚本我先贴下来:



3、首先我们的思路是鼠标点击猪脚创建范围,没有点击到猪脚的话,就什么都不做,当范围显示的时候,我们的点击范围内的位置,猪脚移动,否则就不移动。
知道了这些,我们就需要如下:
一个范围标志:
public GameObject floor;
判断是否选可移动的变量:
int Select=0;
将我们的范围标志保存到列表中:
List<GameObject> floor1=new List<GameObject>();
注意:list需要在开头添加
using System.Collections.Generic;
才能使用。
4、ok,我们先创建范围,想达到的效果如下:

5、我们如下写脚本:
int k = 1;
int z = 0;
for (int i=0; i<7; i++) {
for(int j=0;j<k;j++){
GameObject floor0=(GameObject)Instantiate(floor,new Vector3((i-3)*3.2f+player.transform.position.x,(j-z)*3.2f+player.transform.position.y,0),Quaternion.identity);
floor1.Add(floor0);
}
if(i<3){
z++;
k=k+2;
}else{
z--;
k=k-2;
}
}
如图,我们创建了六行的格子,第一行在猪脚位置向上推移三格(i-3)每个格子3.2大小为3.2f,创建了k个(k=1)也就是1个,让他向左偏移z(z=0)个格子。如果我们不偏移就会向下图一样:

6、然后我们的k加了2,也就是第二行创建了3个,z=1也就是向左偏移一个格子。
然后到了第三行的时候(i>3)的时候,我们的开始反过来,让每行创建k-2个格子,向右偏移z-1个单位。
完成就像这样:
注意:floor1.Add(floor0);将每个格子放到list中去,我们下面会用到。

7、然后我们的逻辑如下:

8、所以脚本如下:
if (Input.GetMouseButtonDown(0)) {
Ray ray = camera.ScreenPointToRay (Input.mousePosition);
RaycastHit hit;
Physics.Raycast (ray, out hit);
if(Select==1){
if(hit.transform.tag=="floor"){
Pos[0]= new Vector3(hit.transform.position.x,player.transform.position.y,0);
Pos[1]= new Vector3(hit.transform.position.x,hit.transform.position.y,0);
point=0;
move ();
print (Pos[1]);
}
for(int i=0;i<floor1.Count;i++){
Destroy(floor1[i].gameObject);
}
Select=0;
}
else
{
if(hit.transform.tag=="player"){
Crefloor();
Select=1;
}
}
print (hit.transform.tag);
}
怎么删除全部的格子呢,前面我们的list就用到了
for(int i=0;i<floor1.Count;i++){
Destroy(floor1[i].gameObject);
}
我们遍历list,将里面的元素都删除就行了。
9、OK,完工,看看效果吧!
