案例制作
涉及到的内容
1.对color的赋值
2.改变随机颜色
3.For循环语句
4.重力
步骤
1.建立一个脚本,命名Main,并绑定到Main Camera的属性面板上
2.建立地面:1)创建一个正方体,并将其拖拽至项目中,这样就生成了预制物体;2)再将创建的正方体删除,这样只保留预制物体;
3)在脚本中使用for语句进行测试,代码如下:
void Start()
{
for(int i=0;i<=9;i++)
{
print(i);
}
}
4)使用代码创建地面,首先创建一个公共变量,Ground,public GameObject Ground;
再在属性面板中将Cube这一预制物体放到属性Ground上,如图:
代码展示
void Start()
{
for(int i=0;i<=9;i++)
{
GameObject one = Instantiate(Ground) as GameObject;//此时在unity中点击开始播放会出现10个预制体方块,但是并不会平铺
}
}
5)此时点击播放生成一排地图,将X轴上铺满,代码如下:
void Start()
{
Vector3 Position;//申请变量,因为制作的是3D的内容,所有模式选择vector3,名字大写,以免和变量发生冲突
for(int i=0;i<=9;i++)
{
GameObject one = Instantiate(Ground) as GameObject;//此时在unity中点击开始播放会出现10个预制体方块,但是并不会平铺
Position = new Vector3(i,0,0);//实例化物体,使其坐标等于i,0,0
one.transform.position = Position;
}
}
6)生成地面的Z轴内容,代码展示如下:
void Start()
{
Vector3 Position;//申请变量,因为制作的是3D的内容,所有模式选择vector3,名字大写,以免和变量发生冲突
for(int i=0;i<=9;i++)
{
for(int a=0;a <=9;a++)//在X轴的i进行循环的过程中,内部的a数值也进行循环,切记要将坐标中的Z轴中的0改为a
{
GameObject one = Instantiate(Ground) as GameObject;//此时在unity中点击开始播放会出现10个预制体方块,但是并不会平铺
Position = new Vector3(i, 0, a);//实例化物体,使其坐标等于i,0,0;此时是改变的X轴坐标
one.transform.position = Position;
}
}
}
完整代码展示如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Main : MonoBehaviour
{
public GameObject Ground;
void Start()
{
Vector3 Position;//申请变量,因为制作的是3D的内容,所有模式选择vector3,名字大写,以免和变量发生冲突
for (int i = 0; i <= 9; i++)
{
for (int a = 0; a <= 9; a++)//在X轴的i进行循环的过程中,内部的a数值也进行循环,切记要将坐标中的Z轴中的0改为a
{
GameObject one = Instantiate(Ground) as GameObject;//此时在unity中点击开始播放会出现10个预制体方块,但是并不会平铺
Position = new Vector3(i, 0, a);//实例化物体,使其坐标等于i,0,0;此时是改变的X轴坐标
one.transform.position = Position;
}
}
}
void Update()
{
}
}
3.制作球滚动的效果
1)创建一个球:修改位置为(0,0,0)
2)将摄像机拖拽至能产生一个俯视的效果(放到和球的x、z轴数值一样的地方,将X轴的角度旋转90度即可),点击播放可以看到球和生成的地面,将球放在中心点的位置(可以在播放状态下移动并记住坐标)
3)在球上加上刚体组件,使它产生重力效果,这时点击播放会有球下落的效果
4)球滚动的效果制作,创建一个脚本,命名为Move,代码展示如下:
public class Move : MonoBehaviour
{
Rigidbody R;
public int Velocity = 1;//控制按键时产生的力的大小,需要在if语句中乘以这一被赋值的字符
void Start()
{
R = transform.GetComponent<Rigidbody>();//获得组件
}
void Update()
{
if (Input .GetKey (KeyCode.W))
{
R.AddForce(new Vector3(0, 0, Velocity));//当按下w键时,会给小球一个向前的力
//如果是5.3以上的版本使用 R.AddForce(Vector3.back/forward/left/right* Velocity);
//左侧: new Vector3(Velocity,0,0)
//右侧: new Vector3(-Velocity,0,0)
//前: new Vector3(0,0,Velocity)
//后: new Vector3(0,0,-Velocity)
}
if (Input.GetKey(KeyCode.S))
{
R.AddForce(new Vector3(0, 0, -Velocity));
}
if (Input.GetKey(KeyCode.A))
{
R.AddForce(new Vector3(Velocity, 0, 0));
}
if (Input.GetKey(KeyCode.D))
{
R.AddForce(new Vector3(-Velocity, 0, 0));
}
}
}
如果觉得速度不够,可以直接在属性面板中进行修改
6)为球设置一个新的颜色,可以获得更好的对比效果,创建生成材质球即可,设置完成后拖拽至Sphere上即可。
7)当球碰撞到地面后发生颜色变化
创建一个颜色数组
完成碰撞代码
完整代码展示如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour
{
Rigidbody R;
public int Velocity = 1;//控制按键时产生的力的大小,需要在if语句中乘以这一被赋值的字符
public Color[] colorful = new Color[7];//设置颜色数组,共设置七种颜色
void Start()
{
R = transform.GetComponent<Rigidbody>();//获得组件
}
void Update()
{
if (Input .GetKey (KeyCode.W))
{
R.AddForce(new Vector3(0, 0, Velocity));//当按下w键时,会给小球一个向前的力
//如果是5.3以上的版本使用 R.AddForce(Vector3.back/forward/left/right* Velocity);
//左侧: new Vector3(Velocity,0,0)
//右侧: new Vector3(-Velocity,0,0)
//前: new Vector3(0,0,Velocity)
//后: new Vector3(0,0,-Velocity)
}
if (Input.GetKey(KeyCode.S))
{
R.AddForce(new Vector3(0, 0, -Velocity));
}
if (Input.GetKey(KeyCode.A))
{
R.AddForce(new Vector3(Velocity, 0, 0));
}
if (Input.GetKey(KeyCode.D))
{
R.AddForce(new Vector3(-Velocity, 0, 0));
}
}
private void OnCollisionEnter(Collision other )
{
//print("a");检测碰撞时是否会产生相应的变化,是否会生成一个a
//other.gameObject.GetComponent<Renderer>().material.color = colorful[0];此时当球撞击到地面时,就会将涉及到的地方变成红色
int i;
i = Random.Range(0,7);//此时i的数值会变成一个随机数
other.gameObject.GetComponent<Renderer>().material.color = colorful[i];//此时就会发生当球撞击地面时会发生随机颜色的变化
}
}
4.拖尾效果的制作:当走到边缘格子的时候给一个反方向的力,这样可以防止小球掉下去
1)调整摄像机为正交视图,方便调整相机和小球的位置,这样可以直接调整Size以调整大小
2)创建一个新的脚本,命名为Hit(碰撞)效果没实现!!!!
代码展示如下
public class Hit : MonoBehaviour
{
GameObject Object;
Rigidbody R;
public int Velocity;
void Start()
{
Object = GameObject.Find("One");
R = Object.GetComponent<Rigidbody>();
}
void Update()
{
if (Object.transform.position.x>9)
{
R.AddForce(new Vector3(-Velocity, 0, 0));
}
if (Object.transform.position.x < 0)
{
R.AddForce(new Vector3(Velocity, 0, 0));
}
if (Object.transform.position.z < 0)
{
R.AddForce(new Vector3(0, 0, Velocity));
}
if (Object.transform.position.z > 9)
{
R.AddForce(new Vector3(0, 0, -Velocity));
}//但是效果未实现
}
}
3)实现拖尾效果
创建材质球,将时间改为3秒,在材质球界面进行拖尾效果的改变。
5.改变球的颜色
从第二秒开始,每隔两秒球自身的颜色发生一次转变,延迟调用
完整代码展示如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour
{
Rigidbody R;
public int Velocity = 1;//控制按键时产生的力的大小,需要在if语句中乘以这一被赋值的字符
public Color[] colorful = new Color[7];//设置颜色数组,共设置七种颜色
void Start()
{
InvokeRepeating("TurnColor", 2, 2);//从第二秒开始,每隔两秒钟进行一次颜色的改变
R = transform.GetComponent<Rigidbody>();//获得组件
}
void Update()
{
if (Input.GetKey(KeyCode.W))
{
R.AddForce(new Vector3(0, 0, Velocity));//当按下w键时,会给小球一个向前的力
//如果是5.3以上的版本使用 R.AddForce(Vector3.back/forward/left/right* Velocity);
//左侧: new Vector3(Velocity,0,0)
//右侧: new Vector3(-Velocity,0,0)
//前: new Vector3(0,0,Velocity)
//后: new Vector3(0,0,-Velocity)
}
if (Input.GetKey(KeyCode.S))
{
R.AddForce(new Vector3(0, 0, -Velocity));
}
if (Input.GetKey(KeyCode.A))
{
R.AddForce(new Vector3(Velocity, 0, 0));
}
if (Input.GetKey(KeyCode.D))
{
R.AddForce(new Vector3(-Velocity, 0, 0));
}
}
void OnCollisionEnter(Collision other)
{
//print("a");检测碰撞时是否会产生相应的变化,是否会生成一个a
//other.gameObject.GetComponent<Renderer>().material.color = colorful[0];此时当球撞击到地面时,就会将涉及到的地方变成红色
int i;
i = Random.Range(0, 7);//此时i的数值会变成一个随机数
other.gameObject.GetComponent<Renderer>().material.color = colorful[i];//此时就会发生当球撞击地面时会发生随机颜色的变化
}
void TurnColor()
{
int a;
a = Random.Range(0, 7);
transform.GetComponent<Renderer>().material.color = colorful[a];//此时每隔两秒钟改变球体自身的颜色
}
}
6.声音组件的建立
1)在摄像机旁边创建一个空物体AudioManage+创建一个Music脚本来控制,将代码绑定到AudioManage上,将声音文件放在合适的位置上。将两个声音文件做成原件可以在别的脚本中进行调用。
完整代码展示如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Music : MonoBehaviour
{
public AudioClip clip1;
public AudioClip clip2;//在AudioClip后不能添加数字,这是数据类型
AudioSource AudioMusic;//找到这些音乐文件对应的组件,然后进行获取
void Start()
{
AudioMusic = this.transform.GetComponent<AudioSource>();
}
void Update()
{
}
public void music1()
{
AudioMusic.clip = clip1;
AudioMusic.Play();
}
public void music2()//因为需要在别的脚本中调用,所以要注意改为公共变量,上同
{
AudioMusic.clip = clip2;
AudioMusic.Play();
}//这样将两个音乐做成了两个原件,可以在别的脚本中对其进行调用
}
(2)在Audio的属性面板中添加Audio Source以调整相关属性,要将开始播放关闭(play on awake)
(3)在Move中和Hit中调用音乐原件即可,部分代码展示如下:
Move中
void TurnColor()
{
GameObject.Find("AudioManager").GetComponent<Music>().music1();//当小球颜色转换时,发出第一个声音
int a;
a = Random.Range(0, 7);
transform.GetComponent<Renderer>().material.color = colorful[a];//此时每隔两秒钟改变球体自身的颜色
}
Hit中(四个都写上)
if (Object.transform.position.x > 9)
{
R.AddForce(new Vector3(-Velocity, 0, 0));
GameObject.Find("AudioManager").GetComponent<Music>().music2();
}
7写脚本完成ESC退出游戏!!!!!!!!否则根本关不掉
创建一个新的脚本命名为SceneTurn,完成代码后一定要将脚本绑定在Main Camera上!!
代码展示如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SceneTurn : MonoBehaviour
{
void Start()
{
}
void Update()
{
if (Input .GetKey(KeyCode.Escape))
{
Application.Quit();
}
}
}
8.发布游戏
File>Build Setting>Add Open Scene>Build