工坊结业项目
部分代码展示
主角代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;
public class Player : MonoBehaviour
{
// 动画组件
private Animator animator;
// 是否在地面
private bool isOnGround = false;
public GameObject jieshu;
public GameObject Wancheng;
// 第一帧就开始执行
void Start()
{
// 获取组件
animator = GetComponent<Animator>();
// 让音效管理器检查下背景音乐
AudioManager.Instance.CheckBG();
}
// 每帧都执行一次
void Update()
{
// 获取玩家左右按键的值,-1 、0 、1
float h = Input.GetAxis("Horizontal");
// 如果不等于0,意味着玩家有移动
if (h!=0)
{
// 移动,方向 * 上一帧花费的时间 * 玩家按键
transform.Translate(transform.right * Time.deltaTime * h);
// 如果往右
if (h > 0)
{
GetComponent<SpriteRenderer>().flipX = false;
}
// 如果往左
if (h<0)
{
GetComponent<SpriteRenderer>().flipX = true;
}
// 播放跑步动画
animator.SetBool("Run", true);
}
// 玩家没移动
else
{
// 退出跑步
animator.SetBool("Run", false);
}
// 如果在地面 同时按了W 也就是跳跃
if (isOnGround&&Input.GetKeyDown(KeyCode.W))
{
// 给刚体组件施加一个向上的力
GetComponent<Rigidbody2D>().AddForce(Vector2.up * 200);
// 让音效管理器播放第2个音效
AudioManager.Instance.Play(1);
}
}
// 碰撞进入则调用
private void OnCollisionEnter2D(Collision2D collision)
{
// 如果我碰到的游戏物体 标签是 Ground
if (collision.gameObject.tag == "Ground")
{
// 关闭跳跃动画
animator.SetBool("Jump", false);
// 当前在地面
isOnGround = true;
}
// 如果碰到的是敌人
else if (collision.gameObject.tag == "Enemy")
怪物代码
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.读入数据
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
// 动画
private Animator animator;
// 方向 1:右边 ,0:左边
private int dir = 1;
// 开始时X轴的坐标
private float startPosX;
// 是否已经死亡
private bool isDie = false;
// 第一帧就开始执行
void Start()
{
// 获取动画组件
animator = GetComponent<Animator>();
// 开始时X轴的坐标
startPosX = transform.position.x;
}
// 每帧都执行一次
void Update()
{
// 如果已经死亡
if (isDie)
{
// 什么都不敢,直接跳出Update,后面都不会执行
return;
}
// 到这里说明没死
// 通过方向位移
transform.Translate(transform.right * Time.deltaTime * 0.8f * dir);
// 如果X轴超过了开始坐标X+0.7
if (transform.position.x> startPosX + 0.7f)
{
// 方向取反
dir = dir * -1;
}
// 如果X轴超过了开始坐标X-0.7
else if (transform.position.x < startPosX - 0.7f)
{
// 方向取反
dir = dir * -1;
}
}
// 碰撞进入,身体部分是碰撞体
private void OnCollisionEnter2D(Collision2D collision)
{
// 只要我碰到的不是地面
if (collision.gameObject.tag!="Ground")
{
// 方向取反
dir = dir * -1;
}
}
// 触发进入,只有头上顶着的是触发器
private void OnTriggerEnter2D(Collider2D collision)
{
// 碰到敌人了
if (collision.gameObject.tag=="Player")
{
// 自己播放死亡动画
animator.SetTrigger("Die");
// 播放第三个音效
AudioManager.Instance.Play(2);
// 往下偏移一些,为了配合死亡动画
transform.position = new Vector3(transform.position.x,transform.position.y-0.0387F, 0);
// 已经死亡
isDie = true;
BoxCollider2D[] collider2Ds;
// 得到所有的碰撞体
collider2Ds = GetComponents<BoxCollider2D>();
// 循环所有碰撞体
foreach (var item in collider2Ds)
{
音效代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioManager : MonoBehaviour
{
// 单例模式
public static AudioManager Instance;
// 音效播放器组件
private AudioSource audioSource;
// 音效片段数组 0死亡2, 1跳 ,2踩敌人 ,3吃金币
public AudioClip[] audioClips;
// 游戏一开始执行
void Awake()
{
// 确定场景中是否存在音效管理器
// 如果没有
if (Instance ==null)
{
// 标志自身是
Instance = this;
// 让Unity不在要场景切换的时候销毁自身
DontDestroyOnLoad(gameObject);
// 查找音效播放器组件
audioSource = GetComponent<AudioSource>();
}
// 如果没有
else
{
// 说明自己是多余的,销毁自己
Destroy(gameObject);
}
}
// 检查背景音乐
public void CheckBG()
{
// 如果背景音乐没有在播放中
if (audioSource.isPlaying==false)
{
// 播放背景音乐
audioSource.Play();
}
}
// 播放音效 播放第几个,是不是要关闭背景音乐
public void Play(int index,bool bgOver = false)
{
// 如果需要关闭背景音乐
if (bgOver)
{
// 停止背景音乐
audioSource.Stop();
}
// 播放一次指定的音效
audioSource.PlayOneShot(audioClips[index]);
}
}