学会使用unity的基本组件以及简单脚本
1.建立正确的开发目录结构
2.层级视图组织,使用3D模型
3.使用材质
4.编写小球可以移动的脚本
资源包链接:添加链接描述
提取码:5lpg
新建3D项目,
新建场景Scene,
创建一个地面Plane(菜单栏→GameObject→3D Object→Plane)如下图所示
创建正确的目录结构
在Assets目录中创建Scenes(场景)文件夹,Scripts(脚本)文件夹,Resources(资源)文件夹,在Resources(资源)文件夹中创建Materials(材质)文件夹。如下图所示
在Materials文件夹中创建新的材质(在Materials文件夹上鼠标右击→Material),在材质右边的属性栏中,将Albedo属性颜色调整为桌面的墨绿色,将材质用鼠标左键长按拖至Plane。新建立方体(菜单栏→GameObject→3D Object→Cube)四个,并适当调整其大小和位置,作为台球桌边框。新建材质调整颜色,并将拖至台球桌边框改变其颜色,效果如图所示。
新建球体(GameObject→3D Object→Sphere),新建白色材质并拖至小球。
为了方便管理,创建空物体(GameObject→Creat Empty),将除了主角白球以外的所有物体拖至该空物体下,如下图所示
在Scripts文件夹中新建脚本(鼠标右键点击Scripts文件夹→Create→C# Script)BallMovingControll.cs,双击脚本进行编辑。(通过Edit→Preferences→External Tools→External Script Editor可设置更改编辑器)学习Unity,默认对C#工具的使用以及比较熟练,就不再过多赘述。
代码如下
/***
*
* “台球游戏”
*
* title:控制小球移动
*
*/
using UnityEngine;
public class BallMovingControll : MonoBehaviour
{
public float FloPower = 1F; //小球移动的速度(力度)
// Update is called once per frame
void Update()
{
//得到键盘按键,控制小球
float floX = Input.GetAxis("Horizontal"); //得到键盘的水平移动数值(键盘的A和D键)
float floY = Input.GetAxis("Vertical"); //得到键盘的垂直移动数值(键盘的W和S键)
//控制小球往右移动
if (floX > 0)
{
//this本脚本,gameObject这个脚本所挂载上的物体,GetComponent获得组件的方法,Rigibody刚体组件,velocity速度属性,Vector3.right*FloPower 给物体施加一个向右的速度值
this.gameObject.GetComponent<Rigidbody>().velocity = Vector3.right * FloPower;
}
//控制小球往左移动
else if (floX < 0)
{
this.gameObject.GetComponent<Rigidbody>().velocity = Vector3.left * FloPower;
}
//控制小球往前移动
if (floY > 0)
{
this.gameObject.GetComponent<Rigidbody>().velocity = Vector3.forward * FloPower;
}
//控制小球往后移动
else if (floY < 0)
{
this.gameObject.GetComponent<Rigidbody>().velocity = Vector3.back * FloPower;
}
}
}
将代码拖至球体控件,点击运行,直接报错了,这是为什么那。这个时候需要在球体的属性界面中,点击Add Component添加组件按钮,添加一个刚体控键(Rigibody),再次运行后,如下图所示
新建若干小球,建立一个空物体Balls,并将小球全部放在空物体下。并为每一个球体增加刚体组件Rigibody。设置多个颜色的材质,拖至各个球体上。如下图所示
在空物体Enviroments下建立四个圆柱体(GameObject→Cylinder),作为球洞,并设置相应位置与数据,如下图所示
将四个圆柱体属性栏中的Capssule Collider(触发器)的Is Trigger属性打上勾,Is Trigger勾上以后,物体则可以穿过去了,但会有碰撞触发的检测。
新建脚本Ball.cs,将代码挂在除主体球以外的其他几个被击球体上。选中四个圆柱体,点开属性面板中的Tag下拉框,选择Add Tag…,点击加号,添加一个新的Tag,命名为“Tag_Hole”,并将几个圆柱体的Tag设为“Tag_Hole”,代码如下
/***
*
* "台球游戏"
*
* Title:球的触发检测
*
*
*/
using UnityEngine;
public class Ball : MonoBehaviour
{
///
/// 触发检测脚本
///
///
void OnTriggerEnter(Collider col)
{
//脚本挂在球上,如果如果碰到一个标签为"Tag_Hol"的,则自身销毁
if (col.gameObject.tag == "Tag_Hole")
{
//销毁本脚本所属游戏对象
Destroy(this.gameObject, 0.5F);
}
}
}
将主球的属性栏中的标签Tag设置为“player”,将CameraFollow.cs托在主摄像机Main Camera,CameraFollow.cs代码如下:
/***
*
* 核心层: 相机跟随脚本(固定角度)
*
*/
using UnityEngine;
using System.Collections;
namespace kernal
{
public class CameraFollow : MonoBehaviour
{
//我们正在追求的目标
public Transform target = null;
// x-z平面到目标的距离
public float distance = 6.0f;
// 我们希望摄像机高于目标的高度
public float height = 8.0f;
// 阻力
public float heightDamping = 4.0f;
public float rotationDamping = 0.0f;
float a = 2.0f;
void Start()
{
//跟随标签为“Player”的物体
target = GameObject.FindGameObjectWithTag("Player").transform;
}
void Update()
{
a -= Time.deltaTime;
if (a <= 0)
{
target = GameObject.FindGameObjectWithTag("Player").transform;
a = 2.0f;
}
}
void LateUpdate()
{
// 如果没有目标,就返回
if (!target)
return;
// 计算当前的旋转角度
var wantedRotationAngle = target.eulerAngles.y;
var wantedHeight = target.position.y + height;
var currentRotationAngle = transform.eulerAngles.y;
var currentHeight = transform.position.y;
// 阻力绕y轴的旋转
currentRotationAngle = Mathf.LerpAngle(currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);
// 阻力高度
currentHeight = Mathf.Lerp(currentHeight, wantedHeight, heightDamping * Time.deltaTime);
// 将角度转换为旋转
Quaternion currentRotation = Quaternion.Euler(0, currentRotationAngle, 0);
// 将相机在x-z平面上的位置设置为:
// 距离目标几米远
transform.position = target.position;
transform.position -= currentRotation * Vector3.forward * distance;
// 设置相机的高度
// 使改变位置y=当前高度;
transform.position = new Vector3(transform.position.x, currentHeight, transform.position.z);
// 总是看着目标
transform.LookAt(target);
// 用于初始化
}
}//结束
}
1:如果C#的字段是public的,则显示在Unity界面属性窗口中。(可以让程序员更改)
2:在Unity中,如果需要模拟自然世界的“物理碰撞”效应,则必须给特定的游戏对象添加Rigibody(刚体)组件