首先因为只是一个小游戏,所以将游戏改为单屏就好。 点击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);括号里面是你的菜单界面的下标,注意返回菜单哪个按钮上需要有点击并执行这个函数的操作 可以加我企鹅更多资料:549–333–291
|