Unity3D开发之贪吃蛇制作
首先因为只是一个小游戏,所以将游戏改为单屏就好。
点击File,选中Build Settings 选中默认得PC,下方有一个Player Settings,点击后,Inspactor面板中会出现Resolution选项,去掉Default Is Full Screen选中状态,自己修改合适屏幕大小。
找到Display Resolution Dialog,选为Disabled。
素材导入,可能是因为Unity3d自身的bug,所以素材导入可能会出现所有图片无颜色的情况,这个时候,可以在打开任意一个Unity3d项目,将当前无颜色的图片拖到那个项目中,图片颜色应该会出现,然后在拖回去即可。不过图片无颜色的情况不包括需要材质的情况。
背景制作,背景的方块自己可以用ps制作。只需要一个方块,将其制作成图案,然后填充整个背景即可。
标题的制作,创建UI界面之Text,设置相应坐标位置,大小,对其方式即可。
开始按钮制作。同理。
左侧的控制面板。说明一下,canvas画布可以和摄像机合并。选中canvas的RenderMode选项,将其改为Screen Space-Camera,然后将摄像机拖入到Render Camera中,就可以实现两者合并。
左侧的控制面板,主要用到了Text,Image,Taggle,Taggle Control,Shadow,outline几个属性,就是布局的操作,知道方法后不是很难
游戏开始界面。复制之前的游戏界面,删除游戏运行中不需要的UI,重新制作左侧的界面,不过现在是游戏进行中的相关信息显示。下方还有两个Image。一个返回开始界面,一个暂停游戏。
游戏碰撞处理,在游戏界面四周添加Box Collider碰撞器,具体添加方式是:制作两个空物体,一个空物体向上移到上边框外10px,一个移动到右边框外10px,设置与边框同样的大小属性。添加Box Collider属性。注意左边的边框的位置需要手动微调一下。
蛇的移动。基本上的UI界面都已经完善好了,现在就是要开始游戏的逻辑代码。
首先想一想,蛇在移动过程中需要些什么变量。方向、速度、每次移动距离。
public int step;private int dx,dy;public float speed=0.4f;
一个实时可以移动蛇的函数move
hpos = gameObject.transform.localPosition;
gameObject.transform.localPosition = new Vector(hpos.x+dx,hpos.y+dy,hpos.z);
一个可以不间断调用move函数的函数InvokeRepeating(“move”,0,speed);
上面的意思就是每个speed时间就调用一次move函数,将蛇向指定位置移动step距离的长度。
移动代码
//加速功能,先停止调用,在重新指定速度调用
if (Input.GetKeyDown(KeyCode.Space))
{
CancelInvoke();
InvokeRepeating(“Move”, 0, speed - 0.15f);
}
if (Input.GetKeyUp(KeyCode.Space))
{
CancelInvoke();
InvokeRepeating(“Move”, 0, speed);
}
//常识,你向上走的时候,不能向下走,不然会和自己的身体相撞
if (Input.GetKey(KeyCode.W) && dy != -step)
{
gameObject.transform.localRotation = Quaternion.Euler(0, 0, 0);
dx = 0; dy = step; //x轴不变,y轴向上每一移动step的距离
}
if (Input.GetKey(KeyCode.A) && dx != step)
{
gameObject.transform.localRotation = Quaternion.Euler(0, 0, 90);
dx = -step; dy = 0;
}
if (Input.GetKey(KeyCode.S) && dy != step)
{
gameObject.transform.localRotation = Quaternion.Euler(0, 0, 180);
dx = 0; dy = -step;
}
if (Input.GetKey(KeyCode.D) && dx != -step)
{
gameObject.transform.localRotation = Quaternion.Euler(0, 0, -90);
dx = step; dy = 0;
}
如此蛇的移动就完成了。
食物的产生,首先在canvas中做出一个40*40大小的图片,为其添加circle Collider 2D碰撞器,将其做成预制体。编写一个食物生成脚本。为了简洁,我们制作一个空物体,每一次生成的食物都放入这个空物体中,以便管理。
我们游戏界面的大小不是固定的,需要自己数清,我的是上下11格,右边19格,左边13格。每一格的大小是30*30,所以我们生成的食物位置。
public int xlimit = 19;
public int ylimit = 11;
public int xoffset = 6;
int x = Random.Range(-xlimit + xoffset, xlimit);
int y = Random.Range(-ylimit, ylimit);
food.transform.localPosition = new Vector3(x * 30, y * 30, 0);
完整代码如下:
public int xlimit = 19;
public int ylimit = 11;
public int xoffset = 6;
public GameObject prefabFood;
public Sprite[] foodSprites; //存放图片数组
private Transform foodHolder;
void Start()
{
foodHolder = GameObject.Find(“FoodManage”).transform;
CreateFood();
}
public void CreateFood()
{
int index = Random.Range(0, foodSprites.Length); //随机生成食物图片
GameObject food = Instantiate(prefabFood); //生成食物预制体
//获得食物图片 要加UntiyEngine.UI头文件
food.GetComponent().sprite=foodSprites[index]; food.transform.SetParent(foodHolder, false); //不让Uniyt自动转图片位置
int x = Random.Range(-xlimit + xoffset, xlimit);
int y = Random.Range(-ylimit, ylimit);
food.transform.localPosition = new Vector3(x * 30, y * 30, 0);
}
碰撞器,在食物产生,并且蛇吃到食物时,需要做出相应的反应。首先蛇头需要添加Circle Collider 2D碰撞器,刚体组件。食物上需要加Box Collider2d。食物和蛇都需要添加标签。
在第一个脚本中添加代码
private void OnTriggerEnter2D(Collider2D collision)
{
//等价于 collision.gameObject.CompareTag(“food”); //标签名称是food
if(collision.tag == “food”){
Destroy(collision.gameObject); //销毁物体
FoodManager.Instance.CreateFo0d(); //创建食物
}
}
就可以了
蛇将食物吃下去以后,就应该需要生成一个蛇身,蛇身和之前的是食物一样,需要先将其预制体做出来,然后写一个函数,在碰撞器产生中执行这个函数来生成这个身体。
这需要一个list数组,每当生成一个蛇身都放入到这个数组中去,因为蛇需要移动,而每一节身体的移动,我们都是后一个身体到原本前一个身体的位置去,所以用数组可以很好的解决。当然也有简单的解决办法,但是这里的蛇身体时奇偶变化的,所以用不了。
蛇身体的两张图片需要相应的存储起来,每吃下一个食物,判断蛇身体个数的奇偶性,再去添加相应的身体图片。
public List bodyList = new List(); //存放蛇的身体
public GameObject bodyPrefab; //生成蛇身体的
public Sprite[] bodySprites = new Sprite[2]; //蛇身体图片,奇偶区别
void Grow()
{
//AudioSource.PlayClipAtPoint(eatClip, Vector3.zero);
int index = (bodyList.Count % 2 == 0) ? 0 : 1;
GameObject body = Instantiate(bodyPrefab,new Vector3(1280,720,0),Quaternion.identity)as
GameObject;
body.GetComponent().sprite = bodySprites[index];
body.transform.SetParent(canvas, false);
bodyList.Add(body.transform);
}
这里的目标奖励和食物做法一样,只需要在食物生成中每次随机产生一个数字,来判断其大小,就可以认为控制奖励的产生几率。
If(Random.Range(1,10000) < 1000){
GameObject reward = Instantiate(perfabreward);
Reward.transform.SetParent(foodHolder,false);
Int dx = Random.Range(-xlimit + xoffset,xlimit);
Int dy = Random.Range(-ylimit,ylimit);
Reward.transform.localPosition = new Vector3(dx * 30,dy * 30,0);
}
分数和长度的处理以及背景颜色的切换。
分数和长度,分别存在于两个Text文本中,我们只需要得到他的控制就可以认为的改变里面的数值。
主要是每次蛇吃下食物以后,都需要更新分数和长度。所以我们就需要将控制分数的脚本写一个单利模式,可以使用该脚本中的函数,但不会修改里面的内容。
背景颜色也就是判断分数段,switch或者if else嵌套都可以解决。
暂停游戏与返回菜单的操作。
暂停游戏简单,难的是你要想到游戏暂停的时候。任何关于蛇的操作都应该停止。Time.timeScale = 0;就是硬性使程序暂停。
返回菜单
点击File选中Bulid Setting。将两个界面拖到中间的大框中,在暂停哪个脚本中写上
UnityEngine.SceneManagement.SceneManager.LoadScene(0/1);括号里面是你的菜单界面的下标,注意返回菜单哪个按钮上需要有点击并执行这个函数的操作
可以加我企鹅更多资料:112--6743--406
更多内容关注这里:http://www.makeru.com.cn/live/1390_1223.html?s=156461