Unity记录1.2-入门-移动、碰撞与菜单
汇总:Unity 记录
摘要:碰撞箱、移动、动画、碰撞影响与主菜单的学习。
角色部件分离
- 拖入人物贴图,精灵(Sprite)模式改为多重,编辑精灵,将精灵对象的各部分分开,并移动转动中心。
- 将处理中心从中心改为支点,以使用我们修改好的转动中心。
- 分层结构中创建空对象,将分离的部件拖进去,保证控制时能同时移动。
角色移动
- 为角色添加组件,2D刚体,并将重力设置为0。
- 为角色创建脚本,并拖动至角色。
- 使用如下脚本,按下方向键左右时,角色会移动。
- 如果不移动,检查游戏运行时的speed,为0时不移动。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class player : MonoBehaviour{
public float speed = 1;
Rigidbody2D rb;
// Start is called before the first frame update
void Start(){
rb = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void FixedUpdate(){
// input
float input = Input.GetAxis("Horizontal");
// move
rb.velocity = new Vector2(input * speed, rb.velocity.y);
}
}
膨胀箱
- 防止角色移动至非可移动区域。
- 层次结构创建空对象,添加组件 Box Collider 2d,并编辑碰撞箱。
- 创建两个碰撞箱,并拖动到世界两边。
- 为角色创建碰撞箱。
动画创建
- 打开动画窗口:Windows-Animation-Animation
- 选中角色身体
- 层级如下,点击 body 来创建动画,而不是 player,我简单试了下, player 坐标会用全局左边,而选择 body 的话是相对坐标。
- 如果点击到head时,动画窗口变空了,可以通过删除 head 的 animation 来解决。
- 正常肯定不是这样搞,不过现在这样可以达到我的目标。
- 点击录制按钮以录制,拖动帧以制定动画时间
player
- body
- head
- hand
- foot
单个目标多个动画
- 在动画窗口,录制键的下方有一行带有当前动画名字的下拉窗口,点击,创建新动画。
- 重新创建动画的话,我暂时不能添加到角色上,点击后会变成已有的。
掉落的物体撞击玩家
- 创建脚本,内容如下
- 将脚本拖动到某对象,对象设置膨胀箱,并将
Is Trigger
属性打钩,对象拖动至玩家上方。 - 将玩家带有碰撞箱的对象设置标签为 Player。
- 游戏开始后,物体掉落,撞击到玩家时,控制台出现
hit
。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Falldown : MonoBehaviour{
public float speed;
// Start is called before the first frame update
void Start(){
}
// Update is called once per frame
void Update(){
transform.Translate(Vector2.down * speed * Time.deltaTime);
}
void OnTriggerEnter2D(Collider2D hitObject){
if (hitObject.tag == "Player"){
print("hit");
}
}
}
预制件
- 将层次结构的东西拖到资产中,形成预制件。
- 预制件拖动到场景后,与其它来自同预制件的物体具有相同属性,更改其属性,可以选择应用至所有同预制件物体。
- 物体更改后,在未应用到预制件前,拖动到资产,可以新成新的预制件,以此创造出属性相同,材质不同的预制件。
碰撞影响
- 将玩家对象的标签改为 Player,并设置敌人的碰撞脚本如下,以令敌人膨胀后触发玩家的受伤脚本。
- 即敌人检测到膨胀后,判断为对玩家膨胀时,令玩家受伤脚本生效。
- 可能的报错:
error CS0122: 'Player.TakeDamage()' is inaccessible due to its protection level
- ref: https://answers.unity.com/questions/1373268/cs0122-error-inaccessable-due-to-protection-level-1.html
- 为了令外部能访问类内的方法,需要加 public 关键字。
// 敌人碰撞脚本
void Start(){
playerScript = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
}
void OnTriggerEnter2D(Collider2D hitObject){
// Hit affact
if (hitObject.tag == "Player"){
playerScript.TakeDamage();
}
}
// 玩家受伤脚本
public void TakeDamage(){
print("Damaged.");
}
碰撞的粒子效果
- 层次结构中创建效果-粒子系统。
- 在监视器里修改循环、材质、持续时间、大小、扩散方式使其符合游戏,并拖动至资产以形成预制件。
- 声明对象
public GameObject hitParticle;
,并在碰撞触发中使用Instantiate(hitParticle, transform.position, Quaternion.identity);
生成效果。 - 拖动预制件至敌人的
hitParticle
上。- 我比较希望在一个基础粒子上生成不同材质的粒子,这样方便不同对象使用不同粒子,不过教程没教,先这样。
主菜单
- 资产创建场景并打开,层次结构中创建 UI 画布,并在其中添加 UI 图像。
- 为 UI 图像添加按钮组件,并创建场景切换脚本,并将脚本作为组件添加给 UI 图像,之后,将作为组件的脚本拖动添加至按钮的点击事件中,并选择
PlayGame
作为运行函数,令该 UI 图像成为启动按钮。- 作为组件的脚本拖动过去后才会出现内部函数,资产拖过去没用。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour{
public void PlayGame(){
SceneManager.LoadScene("Game");
}
}
共有 0 条评论