Unity快速入门之台球小游戏(二)
场景布置小球移动控制添加物理碰撞效果添加触发检测脚本摄像机跟随处理完整代码
目的
学会使用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
{
/// <summary>
/// 触发检测脚本
/// </summary>
/// <param name="col"></param>
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);
// 用于初始化
}
}//结束
}
Unity的知识点:
1:如果C#的字段是public的,则显示在Unity界面属性窗口中。(可以让程序员更改)
2:在Unity中,如果需要模拟自然世界的“物理碰撞”效应,则必须给特定的游戏对象添加Rigibody(刚体)组件
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)