Unity零基础入门 - 见缝插针(Unity2017)
02-创建工程和场景
导入资源:直接把资源从文件夹拖到Unity目录下
改变背景色:修改Camera颜色
03-开发旋转的小球和分数显示
使用资源:直接把目录下的资源拖到Sense里
分数显示:创建-UI-Canvas-Text,调节Text居中Reset、字体颜色、字体大小88等;设置Canvas的Render Mode为World Space(这样可以调节大小),Canvas宽高各设置为100,xy缩放比例为0,01
Render Mode:
Screen Space—Overlay:将UI渲染为摄像机视图顶部的2D图形(默认设置) Screen Space—Camera:也将UI渲染在摄像机视图顶部,但UI元素可以进行透视效果旋转 World Space:将画布对象放置在场景中,就好像UI是3D场景中的一部分
04-控制小球旋转
Rotato旋转默认逆时针
找不到脚本:注意类名与文件名一致
05-开发针的Prefab预制体
针:细杆+小圆,小圆组合于细杆下,再加入预制体,给小圆加上碰撞器。
06-开发GameManager去生成针
GameManager:Unity特殊脚本
07-控制针移动到就位位置
Pin脚本:给Prefab加脚本,在update()中控制当前物体向目标位置匀速运动,距离小于某小值时停止
if (isFly == false)
{
if (isReach == false)
{
transform.position = Vector3.MoveTowards(transform.position, startPoint.position, speed * Time.deltaTime);
if (Vector3.Distance(transform.position, startPoint.position) < 0.05f)
{
isReach = true;
}
}
}
08-控制针的插入
改Prefab名,如果Prefab不变,可以在物体里Apply一下。
针运动目的地异常Bug:分析可能原因,可以采取禁用组件,打Debug.Log(),把脚本中组件改为public运行时查看其对应物体,
通过点击事件启动针中的运动
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0))
{
// 如果没有下面的SpawnPin(),针的移动会重新启动,导致针歪着
currentPin.startFly();
// Debug.Log(" currentPin.startFly()");
}
}
void SpawnPin()
{
//类、位置、旋转
//GameObject.Instantiate(pinPrefab, spawnPoint.position, pinPrefab.transform.rotation);
currentPin = GameObject.Instantiate(pinPrefab, spawnPoint.position, pinPrefab.transform.rotation).GetComponent<Pin>();
//Debug.Log(" currentPin" + currentPin == null);
}
具体运动启动与停止的方法
// Update is called once per frame
void Update () {
if (isFly == false)
{
if (isReach == false)
{
transform.position = Vector3.MoveTowards(transform.position, startPoint.position, speed * Time.deltaTime);
if (Vector3.Distance(transform.position, startPoint.position) < 0.05f)
{
isReach = true;
}
}
}
else
{
transform.position = Vector3.MoveTowards(transform.position, targetCirclePos, speed * Time.deltaTime);
if (Vector3.Distance(transform.position, targetCirclePos) < 0.05f)
{
isFly = false;
transform.position = targetCirclePos;
transform.parent = circle;
}
}
}
public void startFly()
{
//Debug.Log("startFly()");
isFly = true;
isReach = true;
}
09-控制针达到的位置和针的连环发射
控制针达到的位置:从预制体生成一个针对象,控制针对象插到球表面,获得此时针的position(此针对象是临时的,所以实际坐标相对于球心的)。将这个position设置为针的目标点,针到达之后把针的父对象设置为圆,这样针就可以跟随圆旋转了。(如上)
针的连环发射:点击响应时,启动当前针移动后,还要生成一个新的针赋给当前针。
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0))
{
// 如果没有下面的SpawnPin(),针的移动会重新启动,导致针歪着
currentPin.startFly();
// Debug.Log(" currentPin.startFly()");
//重新生成一个针
SpawnPin();
}
}
10-针头的碰撞和游戏结束的处理
针头的碰撞:给针头添加Circle Collider2D(Is Trigger 勾选碰撞触发)和Rigidbody 2D(Gravity Scale 重力加速度设为0),加脚本PinHead,记得给针头设置Tag
private void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log("发生碰撞");
if (collision.tag == "PinHead")
{
Debug.Log("针头碰撞");
GameObject.Find("GameManager").GetComponent<GameManager>().GameOver();
}
}
public void GameOver()
{
if (isGameOver) return;
GameObject.Find("Circle").GetComponent<RotatoSelf>().enabled = false;
isGameOver = true;
//StartCoroutine(GameOverAnimation());
}
11-控制分数的显示
通过在点击发针的事件中增加并显示数字
void Update()
{
if (isGameOver) return;
if (Input.GetMouseButtonDown(0))
{
score++;
scoreText.text = score.ToString();
// 如果没有下面的SpawnPin(),针的移动会重新启动,导致针歪着
currentPin.startFly();
// Debug.Log(" currentPin.startFly()");
//重新生成一个针
SpawnPin();
}
}
12-游戏结束动画的显示
GameOver()中调用
IEnumerator GameOverAnimation()
{
while (true)
{
//插值动画,由当前色过渡到目标色
mainCamera.backgroundColor = Color.Lerp(mainCamera.backgroundColor, Color.red, speed * Time.deltaTime);
mainCamera.orthographicSize = Mathf.Lerp(mainCamera.orthographicSize, 4, speed * Time.deltaTime);
if (Mathf.Abs(mainCamera.orthographicSize - 4) < 0.01f)
{
break;
}
yield return 0;
}
yield return new WaitForSeconds(0.5f);
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
游戏发布和运行
发布游戏:生成两个文件,一个exe和一个数据文件夹,两者缺一不可
复现见缝插针:如上