小球
先搭一个场地Plane,命名Map ,通过将四个墙的立方体归入Map,可以同时控制大小。
分别赋予场地和墙的材质
创造一个小球Player 赋予材质和刚体,因为要实现键盘操作控制小球,因此需要写脚本挂载到Player上。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 所有能够挂载到游戏对象的组件都要继承 MonoBehaviour
// 文件名和类名保持一致,如果不一致就不能挂载在上去
public class PlayerController : MonoBehaviour
{
public float speed;
//刚体组件,作用:添加重力效果
Rigidbody rig;
//public 类型的字段大部分都是可以序列化(保存到本地)
// 资源初始化函数,只执行一次 , 类似构造函数的功能
void Start()
{
//推荐使用这样赋值
rig = GetComponent<Rigidbody>();//获取当前组件所在对象上的其他组件
}
// 逻辑处理和按键处理函数,每帧执行一次
void FixedUpdate() //用来处理物理相关函数
{
//通过wasd 控制角色移动
float h = Input.GetAxis("Horizontal");//获取水平按键轴值*(-1~1
float v = Input.GetAxis("Vertical");
/* print(h);
Debug.Log("日志信息");
Debug.LogError("错误信息");
Debug.LogWarning("警告信息");*/
//通过刚体组件给角色添加一个力,使其移动
if (rig)//判断rig是否为空
{
rig.AddForce(new Vector3(h, 0, v) * speed);
}
//按下空格键之后,
if (Input.GetKeyDown(KeyCode.Space))
{
rig.AddForce(Vector3.up * speed);
}
}
}
金币
由于后面要不断地创建新的金币, 因此直接将金币的游戏对象放入预设体中, 然后创建一个空的GameObject管理已经创建的金币。
(Resources文件夹的名字固定不可更改)
我们需要让小球绕着世界坐标Y轴自转 ,创建一个Coin的脚本,在里面定义旋转速度:
可以在Unity里面操作这个数值(前提这个字段必须是public ):
当小球触碰到金币时 , 金币会消失:
此时有两种方式:
碰撞检测
//刚开始碰撞执行的函数
private void OnCollisionEnter(Collision collision)
{
// Destroy(this);//销毁当前脚本对象
Destroy(this.gameObject); //销毁当前脚本挂载的组件对应的游戏对象
}
//离开碰撞执行的函数
private void OnCollisionExit(Collision collision)
{
}
//待在碰撞器里面执行的函数
private void OnCollisionStay(Collision collision)
{
}
触发检测
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player")) //只有跟小球触碰才销毁
{
Destroy(this.gameObject);
}
}
private void OnTriggerExit(Collider other)
{
}
private void OnTriggerStay(Collider other)
{
}
金币脚本代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Coin : MonoBehaviour
{
// Start is called before the first frame update
public float rotateSpeed;//金币每秒钟旋转速度
void Start()
{
//给金币一个随机旋转角度
//Random是个随机类
rotateSpeed = Random.Range(60, 360);
}
// Update is called once per frame
void Update()
{
//Time类是时间控制类 ,deltaTime是每两帧之间的时间间隔
transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime, Space.World);//绕着Y轴
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player")) //只有跟小球触碰才销毁
{
Destroy(this.gameObject);
}
}
}
之后通过ItemManager(也就管理所有金币的游戏对象)的脚本生成金币
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemManager : MonoBehaviour
{
//给预设体赋值2种方式:
/*
1 设定public变量,在属性面板直接拖拽赋值
2 通过资源管理器加载赋值 ,Resources文件夹(名字固定)
*/
GameObject goCoinPrefab;//金币预设体对象
// Start is called before the first frame update
void Start()
{
goCoinPrefab = Resources.Load<GameObject>("Prefabs/Coin"); //通过资源管理器加载预设体对象,只是在内存中没有实例化引擎
for (int i = 0; i < 10; i++)
{
GameObject goCoin = Instantiate(goCoinPrefab);//创建实例对象(克隆函数),生成到场景中
goCoin.transform.position = new Vector3(i, 0.74f, 0); //对象属性赋值
goCoin.name = "coin" + i;
goCoin.transform.parent = this.transform;
}
}
// Update is called once per frame
void Update()
{
}
}
效果如下:
资源管理器的整理: