当前位置: 代码迷 >> 综合 >> Roll A Ball
  详细解决方案

Roll A Ball

热度:87   发布时间:2023-11-25 23:35:21.0

任务目录 : 初始设置 , 移动玩家 , 移动摄像机 , 设置游戏场地 , 创建收集物 , 收集物品 , 展示分数和文本 , 编译游戏
学习:如何新建游戏对象,在场景中放置它们,添加新组件
通过编写简单的脚本自定义行为:了解如何使用光源,摄像机,碰撞器,触发器,刚体,收集并统计游戏对象

给模型添加颜色和纹理(texture)用到(material)

修改camera的Y轴为60 让player产生更好轮廓

private Rigidbody rb;()

使用物理系统需要游戏组件和刚体组件(rigidbody component)
可以点击组件的标题栏折叠或展开组件视图(会切换场景视图中相关组件的辅助线)
获取键盘输入转换为对球的作用力来让球移动(创建脚本):
每一帧都检测输入每一帧应用到游戏对象上(Update || Fixed Update)
区别:Update在每一帧展示之前被调用 Fixed Update 进行任何物理计算之前被调用(搜索unity API:Ctrl + ')
想对游戏物体施加力(AddForce)
创建变量 : Vector3 名称 = new Vector3( x , y , z );
rb.AddForce ( 名称 ) ;
新建一个公共变量 (Speed) : 使其出现在Inspector 中,通过Speed对movement的更改,从而在unity内控制Player的速度变化

偏移量 ( offset value ) 玩家与摄像机的距离,通过脚本关联玩家和摄像机
公共变量 public GameObeject player;

私有变量 Vertor3 offset;

计算偏移值 : 需要取摄像机当前的 transform position 减去玩家的transform position

每当我们把东西从分层视图拖进项目视图时就创建了一个新的预设资源(包含一个对象或对象组的模板或原型)

碰撞组件 ( collider component ) :
Collider.OnTirggerEnter : { 会在Player第一次碰到触发碰撞器(tigger collider)的时候被调用,拿到一个碰到的触发碰撞器的引用的参数 ,这个是触发器 叫Other 让我们可以持有接触到的碰撞器 }

Tag允许辨识游戏对象,在使用前必须在Tags and Layers Panel 中声明tag --> 判断一个tag的字符串跟某个值是否相等

if ( gameObject.tag == “Some String Value”)
使用CompareTag 即可高效比较任意对象的tag值

gameObject.SetActive ( false ) --> 控制游戏对象是否可见的方法
( 相当于在unity中的物体箭头勾选 )

void OnTriggerEnter(Collider other)
{
Destroy(other.gameObject);
}
(根据代码,当碰到另一个触发碰撞器时,调用 Destroy(other.gameObject ) 一旦游戏对象被销毁 , 他和他的的子对象以及所有的组件都会一并移除 )

标准(standard)刚体依赖物理力移动;运动(kinematic)刚体依赖transform组件移动

Kinematic : 不会对物理力有反应,但是会活动(或者通过transform运动) 可应用与电梯;可移动的平台

为了显示文本,用到Unity的UI工具箱 ( Toolset )

所有的UI元素必须是一个画布的子元素,UI工具箱的引用,需要使用其命名空间(using UnityEngine.UI;)

首先新建公共文本变量countText(保存UI文本游戏对象)
需要给Text设置初始值 :
countText.text = “Count”+count.Tostring();
现在每捡起一个对象都要更新text属性 -->在OnTriggerEnter中还应该来一遍 countText.text = “Count”+count.Tostring();
所以创建一个参数void SetCountText()
{
countText.text = “Count”+count.Tostring();
}
为了在游戏结束的时候输出“游戏结束” : Create 一个UI text
先设置初值 : winText.text = “”;(设置为空字符串或两个无内容的双引号)
然后在脚本中通过 if 语句判断(count >= n)–>
winText.text = “You Win!”;

编译游戏之前先保存场景,必须先打开Build Setting
private Rigidbody rb;(创建变量持有引用)
void Start(){
rb = GetComponent( );
}
void FixedUpdate(){
float moveHorizontal = Input.GetAxis(“Horizontal”);
float moveVertical = Input.GetAxis(“Vertical”);

Vertor3 movement = new Vertor(moveHorizontical,0.0f,moveVerticial);

rb.AddForce ( movement);
}

public GameObject player;
private Vertor3 offset;
void Start() { offset = transform.position - player.transform.position }
void LateUpdate() {
transform.position = player.transform.position + offset }
(一旦用键盘控制角色移动,在每一帧摄像机展示拍摄画面之前,摄像机都先移动到跟角色相关的新的位置)

Rotator : 已经设置角度(45,45,45)希望每帧都旋转,为了使动作更平滑而且与帧率无关,需要*Time.deltaTime
用到(transform.Rotate): transform.Rotate(new Vector3(15,30,45))*Time.deltaTime);

补充:施加力 : Input.GetAxis(" ");
浮点型变量 : moveHorizontal moveVertical (记录控制的横纵坐标)
X轴:Horizontal Z轴:Vertical