有加分管理、碰撞检测、控制保龄球发射的代码
1.先搭建场景,建立地面(plane)防止保龄球超过跑到落入深渊,跑道(cube),保龄球(sphere),球瓶(capsule,这里简单的选这个,如果想更像可以用样条线旋转或放样制作)。
2.为了使球瓶被撞倒,需要为它加上刚体(rigibody),球瓶需要将rigibody的重力(use gravity)关上,关于重力(mass)可按生活自行调节,保龄球也需要加刚体(如果不加,球停不下来,因为球加不上力)
3.开始创建代码脚本,将代码赋予保龄球(此处代码是Z轴移动,需要保证保龄球方向朝向球瓶,如果方向相反,则要改变坐标轴方向,或者改变代码方向,还有可以重做保龄球)。下面是控制保龄球的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RoleControl : MonoBehaviour
{
// 1.玩家控制一个保龄球,按下空格键,开始发射
//拿到物体
GameObject MainRole;//变量名字与场景名字无关,无需赋值
Rigidbody Onerigi;
public float ForceDATA = 100f;//public添加上可以在外边改变力的大小
bool isDown = true;
void Start()
{
MainRole = GameObject.Find("Baolingqiu");//此处需与场景名字一致
}
void Update()
{
if (Input.GetKey(KeyCode.Space) && isDown)//如果用户按下空格键)
{
//开始添加力给保龄球(需要先拿刚体组件刚体),要想拿先要存
Onerigi = MainRole.GetComponent<Rigidbody>();//获取组件
Onerigi.AddForce(new Vector3(0, 0, -1) * ForceDATA, ForceMode.Impulse);//添加力和方向
isDown = false;//用户只能按一次
}
}
}
4.以2D形式在屏幕上显示加分。创建一个新脚本来进行加分,点UI文本,以2D模式改变得分框(新建文本框都会弹出一个窗口,选择点击如图所示),然后改变颜色,此处UI文本框的运用需要在代码中执行。
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
public class ScoreManager : MonoBehaviour
{
// 如果撞倒了花瓶就加分
//挂在物体上才能使用(物体没有要求,这里创建了空物体)
TMP_Text OneWenBen;
GameObject wenben;
public static int currentScore = 0;//静态的,需在另一个代码中访问它
private void Start()
{
wenben = GameObject.Find("Text (TMP)");//存储文本框
OneWenBen = wenben.GetComponent<TMP_Text>();//获取组件
}
private void LateUpdate()//later是为了让加分发生在碰撞后
{
Debug.Log("恭喜你!得分了!你的分数是:" + currentScore);
OneWenBen.text = "Score:" + currentScore.ToString();//使文本框实时存储分数
}
}
5.创建一个专门检测碰撞的脚本。(此游戏我将碰撞代码、得分代码(加分的代码是随意的,也可挂在其他或者空物体上)、球的移动代码都赋予球身上)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CollisionTest : MonoBehaviour
{
// 碰撞检测
//这个是触发检测
//private void OnTriggerEnter(Collider other)//other就是发生了碰撞,把谁存起来
//{
//发生了碰撞
// ScoreManager.currentScore += 1;
// Debug.Log("开始碰撞");
// Debug.Log(other.gameObject.name);
// }以上代码有问题可以不需要
//这个是碰撞检测
private void OnCollisionEnter(Collision collision)
{
Debug.Log("开始碰撞");
if(collision .collider .gameObject .name!="Cube"&&collision.collider.gameObject.name != "Plane")
{
ScoreManager.currentScore += 1;//通知分数管理器类加分,两个类之间相互访问变量
}
Debug.Log(collision.collider.gameObject.name);
}
}
目前来说这个游戏还有一些bug,就是假设你设置的保龄球撞击,它的分数记的是保龄球撞到的并且碰到的球瓶数量,而非保龄球撞击后倒下的球瓶数,也就是说哪怕球瓶全倒了,也可能不会是满分