食物随机生成。
上下11.左14.右21.
SetParent.false.
食物随机生成。
上下11.左14.右21.
SetParent.false.
[任务13:10-第一个食物的随机生成]
导入(老师是说加上)UnityEngine.UI
要在最开头
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
加上using UnityEngine.UI;
就是这样
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
下面附上本节课的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class FoodMaker : MonoBehaviour {
public int xlimit = 20;
public int ylimit = 11;
public int xoffset = 8;
public GameObject foodPrefab;
public Sprite[] foodSprites;
private Transform foodHolder;
private void Start()
{
foodHolder=GameObject.Find("FoodHolder").transform;
MakeFood();
}
void MakeFood()
{
int index = Random.Range(0, foodSprites.Length);
GameObject food = Instantiate(foodPrefab);
food.GetComponent<Image>().sprite = foodSprites[index];
food.transform.SetParent(foodHolder, false);
int x = Random.Range(-xlimit + xoffset, xlimit);
int y = Random.Range(-ylimit , ylimit);
food.transform.localPosition = new Vector3(x * 30, y * 30, 0);
}
}
int xlimit=21,;int ylimit=11;
int xoffset =7;
Transform FoodHolder;
GameObject food;
Sprite[] footSprites;
int index = Random.Range(0,foodSprite.
length);
GameObject foood= Instantiate(food);
void Makefood()
{
}
1.食物注意:生成的位置需要让蛇能够吃到,所以以蛇头的长宽做网格,生成在有效的网格内
食物需要生成在 下-6*30,上6*30,左7*30,右11*30
2.制作食物的prefab,Image,设置合适大小
3.创建归类用的空物体,FoodHolder
注意:在UI中,如果创建一个归类用的空物体,那么最好将大小锚点设置到父物体四个角上
3.添加脚本FoodMaker
//上下左右食物生成坐标的限制
public int xRightLimit = 11;
public int yLimit = 6;
public int xLeftLimit = 7;
public GameObject food;
//图片数组,Sprite用来存储图片
public Sprite[] foodSprites;
private Transform foodHolder;
void Start()
{
foodHolder = GameObject.Find("FoodHolder").transform;
MakeFood();
}
//生成条件:开始生成一个,被吃掉生成一个
void MakeFood()
{
int index = Random.Range(0,foodSprites.Length);
//将食物实例化出来(面板拖出来)
GameObject food = Instantiate(foodPrefab);
//
food.GetComponent<Image>().sprite = foodSprites[Index];
//食物归类到父物体,且不调整food的transform
food.transform.setParent(foodHolder,false)
//随机位置
int x=Ramdom.Range(-xLeftLimit,xRightLimit );
int y = Ramdom.Range(-yLimit,yLimit);
food.transform.localPosition = new Vector(x*30,y*30,0);
}
4.创建一个空物体,专门用来挂脚本,然后将FoodPrefab赋值,foodSprites全选图片拖住赋值
上下11,左14 右21
public int xlimit= 21;
public int ylimit= 11;
public int xoffset= 7;
public GameObject foodprefab:
public Sprite[] foodsprites;
private Transform foodHolder;
void Start()
foodHolder=GameObject.Find("FoodHolder").transform; MakeFood();
void MakeFood(){
int index = Random.Range(0,foodsprites.Length);
GameObject food = Instantiate(foodPrefab);
food.GetComponent<Image>().sprite=foodsprites[index];
food.transform.SetParent(foodHolder,false);
int x= Random.Range(-xlimit +xoffset,xlimit);
int y = Random.Range(-ylimit,ylimit);
food.transform.localPosition = new Vector3(x* 30,y* 30,0);
}
食物的随机生成
食物生成是要step的倍数
public int x=21;
public in y=11;
public in y=11;
public gameobject foodprefab;
public sprite[] foodsprites;
void makefood()
{
int idex=random.range(0, foodsprites.lenth)
}
food .getcomponent
instantiate()实例化
// C# => public void SetParent(Transform parent, bool worldPositionStays);
//设置实例物体的父物体.
//这个方法是把一个对象找个父级,
//如果worldPositionStays为true,那么该对象会保持世界坐标不变,相对于父级位置、缩放和旋转修改该对象,使得该对象保持与之前世界坐标空间一样的位置,旋转和缩放。
//如果为false那么该对象会保持局部坐标不变。
food.transform.SetParent(foodHolder, false);
食物要生成在Step范围之内
计算食物生成范围
食物随机生成 step的整数倍 从000到上端 11步
-11~11(*30) 21步右 左13
变量 上下左右限制 预制体公共 foodHolder transform
只需一个预制体 到时候直接填图片即可 (同质)
图片数组
方法
1start里找到 foodHolder.transform
2存下索引 随机遍历 实例化 坐标随机 再赋给food vector3坐标 这样的话就不用在Instantiate里写坐标了
3再拿到food身上的image组件。sprite=数组 索引
4加上unityUI的namespace
最后在start里调用makefood 还要专门找一个物体来放这个脚本
而之前是用数组 再随机?
吃掉再生成
再创建一个空物体?锚点 四周定位 把创建出来的食物放在他的子物体 SetParent(这个可以说是很常见了 flase 不然会自动缩放
在ControPanel下建Image,Width:40,Height:40,再写脚本FoodMaker
{
public int xlimit=21;
public int ylimit=11;
public int xoffset=7;
public GameObject foodPrefab;
public Sprite[] foodSprites;
private Transform foodHolder;
void Start()
{
foodHolder=GameObject.Find("FoodHolder").transform;
MakeFood();
}
void MakeFood()
{
int index=Random.Range(0,foodSprites.Length);
GameObject food=Instantiate(foodPrefab);
food.GetComponent<Image>().sprite=foodSprites[index];
food.transform.SetParent(foodHolder,false);
int x=Random.Range(-xlimit+xoffset,xlimit);
int y=Random.Range(-ylimit,ylimit);
food.transform.localPosition=new Vector3(x*30,y*30,0);
}
}
创建一个GameObject,重命名ScriptsHolder,将Food Maker放里,把Icon文件里的Food放入 Food Sprites。