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(刚体)组件

猜你喜欢

转载自blog.csdn.net/weixin_49251429/article/details/124714484