``
1、第一步把玩家、玩家打出的子弹、敌人、敌人打出的子弹的脚本创建出来。
2、第二步把玩家、玩家打出的子弹、敌人、敌人打出的子弹拖到场景中执行。
3、第三步就开始写脚本内容了
写脚本内容跟据需求第一步来写玩家的移动,还有控制玩家不出游戏界面,脚本如下:
private float speed = 10 ;//键盘控制的速度
private float offSet = 10f;//飞船的偏移量
private Rigidbody r;
public GameObject bullet;//子弹
public Transform pos;//弹口
public AudioClip clip;//音频
void Start () {
//获取刚体
r = GetComponent<Rigidbody>();//这是获取刚体组件
}
void Update () {
Move();
Fire();
}
void Fire()
{
if (Input.GetButtonDown("Fire1") &&Time.time>nextTime)
{
nextTime = spacetime + Time.time;//下一颗子弹运行的时间=每颗子弹飞行的时间+游戏运行时间
Instantiate(bullet, pos.position, Quaternion.identity);
}
}
void Move()
{
//用键盘来控制玩家飞机移动
float x = Input.GetAxis("Horizontal") * speed;
float z = Input.GetAxis("Vertical") * speed;
//transform.Translate(new Vector3(x, 0, z));
r.velocity = new Vector3(x, 0, z);
//设置边界值不让飞机飞出屏幕
float xPos = Mathf.Clamp(transform.position.x, -6f, 6f);
//Mathf.Clamp(自身的x轴,边界的最小值,边界的最大值)
float zPos = Mathf.Clamp(transform.position.z, -43f, -22f);
transform.position = new Vector3(xPos, transform.position.y, zPos);
//飞船的偏移
r.rotation = Quaternion.Euler(0, 0, r.velocity.x * offSet * (-1));
//控制飞船的偏移公式为
//r.rotation=Quaternion.Euler(自身的x轴不变,自身的y轴不变,x轴的刚体*偏移量*(-1))
}
玩家的子弹的克隆写在玩家身上脚本里比较好,子弹的脚本就给它专门写子弹的操作,子弹碰到陨石摧毁陨石产生爆炸声,子弹代码如下:
private float speed = 2f;//控制速度
public GameObject explosion;//爆炸声音
void Start () {
}
void Update () {
//子弹向前飞的力
transform.Translate(Vector3.forward * Time.deltaTime * speed);
}
void OnTriggerExit(Collider other)//触发器(出来的时候写这个触发器)
{
if (other.CompareTag("Border"))//子弹碰到你设置的一个边界触发器
{
Destroy(gameObject);//碰到了就把子弹摧毁
}
}
void OnTriggerEnter(Collider other)//触发器(刚进这个触发器的时候)
{
if (other.CompareTag("Asteroid"))//碰到了陨石
{
Destroy(gameObject);//摧毁子弹
Destroy(other.gameObject);//摧毁陨石
GameObject go = Instantiate(explosion, other.gameObject.transform.position, Quaternion.identity);//克隆爆炸声音
Destroy(go, 1f);
GameManager.gm.score++;//这是积分器,是在后面代码中
}
}
再建一个专门管理陨石生成和血量和界面跳转等各种操作,代码如下:
我这陨石是用数组来存储的
public GameObject[] asteroids;//用数组来存储陨石
public Text playerHpText, scoreText;//这个是要创建一个UI界面
//HideInInspector表示将原本显示在面板上的序列化值隐藏起来
[HideInInspector]
public int playerHp = 10;//这个是定义一个玩家的血量
[HideInInspector]
public int score = 0;
public GameObject Win, gameOver;//这是个游戏的赢的界面和游戏结束的界面
//unity 单例模式
public static GameManager gm;
void Start()
{
gm = this;//就是把本类赋值给gm
StartCoroutine(Print());
}
//用协程来克隆陨石,用死循环来每秒克隆陨石
IEnumerator Print()
{
while (true)
{
yield return new WaitForSeconds(3f);
for (int i = 0; i < asteroids.Length; i++)
{
// 用到随机数来克隆陨石的位置
int x = Random.Range(-6, 6);//x轴随机
int z = Random.Range(-21, -22);
Vector3 pos = new Vector3(x, 0.28f, z);
Instantiate(asteroids[i], pos, Quaternion.identity);
}
yield return new WaitForSeconds(6f);
}
//}
}
void Update () {
if (score==10)
{
Time.timeScale = 0;
Win.SetActive(true);
}
if (playerHp==0)
{
Time.timeScale = 0;
gameOver.SetActive(true);
}
playerHpText.text = playerHp.ToString();
scoreText.text = score.ToString();
}
//这个两个是按钮事件,达到跳转界面效果
public void GoToStart()
{
SceneManager.LoadScene("start");
}
public void GoToGame2()
{
SceneManager.LoadScene("Game2");
//Time.timeScale = 1;//这个语句是用于游戏的暂停和开启的作用
}
接下来我们来做第二个界面的脚本
第二个脚本主要是来玩家飞机来打对方飞机的第二关,要求如下:
这个需求是要求我们需要用协程或者Invoke,或者是InvokeReapting来做,现在主要使用的是协程
在Start里面启动协程
private Rigidbody r;//加刚体
private float spacetime = 1f;//每颗子弹间隔的时间
private float nextTime;//下一颗子弹发射的时间
private float moveSpeed = 2f;//移动速度
private int enemyHp = 1;
public GameObject bullet;//敌人子弹
public Transform pos;//敌人发射子弹的炮口
public AudioClip clip;//爆炸特效
public GameObject exlopion;//敌机爆炸特效
void Start()
{
r = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
r.velocity = Vector3.back * moveSpeed;//自动下落速度
Fire();
}
void Fire()
{
if ( Time.time > nextTime)
{
nextTime = spacetime + Time.time;//下一颗子弹运行的时间=每颗子弹飞行的时间+游戏运行时间
// nAudioSource.PlayClipAtPoint(clip, transform.position, 1);
Instantiate(bullet, pos.position, Quaternion.identity);
}
}
void Move()
{
//设置边界值不让飞机飞出屏幕
float xPos = Mathf.Clamp(transform.position.x, -6f, 6f);
float zPos = Mathf.Clamp(transform.position.z, -43f, -22f);
transform.position = new Vector3(xPos, transform.position.y, zPos);
}
//这也是用碰撞器来摧毁敌人和敌人子弹子弹
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
enemyHp--;
if (enemyHp <= 0)
{
GameObject go = Instantiate(exlopion, transform.position, Quaternion.identity);
//Destroy(go, 1f);
Destroy(gameObject);
}
}
if (other.CompareTag("PlayerBullet"))
{
enemyHp--;
Destroy(other.gameObject);
if (enemyHp <= 0)
{
GameObject go = Instantiate(exlopion, transform.position, Quaternion.identity);
//Destroy(go, 1f);
Destroy(gameObject);
}
}
}
//用碰撞器来摧毁那些没有被飞机打到敌机
void OnTriggerExit(Collider other)
{
if (other.CompareTag("Border"))
{
Destroy(gameObject);
}
}
这个敌人飞机就跟上面的陨石一样生成,这边就偷下懒,就不仔细写了
void Start(){
StartCoroutine(Clone());
}
IEnumerator Clone()
{
while (true)
{
yield return new WaitForSeconds(8f);
for (int i = 0; i < enemy.Length; i++)
{
int x = Random.Range(-6, 6);
int z = Random.Range(-27, -14);
Vector3 pos = new Vector3(x, 0.29f, z);
Instantiate(enemy[i], pos, Quaternion.identity);
}
yield return new WaitForSeconds(8f);
}
这里写的代码是敌人子弹的代码
private float speed = 5f;//这是定义的速度
void Start () {
}
void Update () {
transform.Translate(Vector3.back * Time.deltaTime * speed);//给了子弹位移
}
void OnTriggerExit(Collider other)
{
if (other.CompareTag("Border"))
{
Destroy(gameObject);
}
}
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
GameManager1.gm1.playerHp--;
Destroy(gameObject);//摧毁的是敌人的子弹
}
}
这是一个UI界面的代码,主要的作用是实现登录注册的功能
public InputField nameInput, pwdInput;
public void RegButton()
{
//这是用本地存储来存储玩家输入的账号密码
PlayerPrefs.SetString("name",nameInput.text);
PlayerPrefs.SetString("pwd", pwdInput.text);
}
public void LoginButton()
{
//用GetString来读取存储在本地内存里面的数据
string name= PlayerPrefs.GetString("name");
string pwd= PlayerPrefs.GetString("pwd");
//符合这注册的账号密码就可以登录
if (name==nameInput.text&&pwd==pwdInput.text)
{
SceneManager.LoadScene("Game");
Time.timeScale = 1;
}
}
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里编辑 3.解析依赖到项目中
Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c
三分钟集成Tap防沉迷SDK(Unity版)一、SDK介绍基于国家对上线所有游戏必须增加防沉迷功能的政策下,TapTap推出防沉迷SDK,供游戏开发者进行接入;允许未成年用户在周五、六、日以及法定节假日晚上8:00-9:00进行游戏,防沉谜时间段进入游戏会弹窗进行提示!开发环境要求:Unity2019.4或更高版本iOS10或更高版本Android5.0(APIlevel21)或更高版本🔗Unity集成Demo参考链接🔗UnityTapSDK功能体验APK下载链接二、集成前准备1.创建应用进入开发者后台,按照提示开始创建应用;2.开通服务在使用TDS实名认证和防沉迷服务之前,需要在上面创建的应
写在前面前两天学习并整理的大气散射基础知识:【Unity大气渲染】关于单次大气散射的理论知识,收获了很多,但不得不承认的是,这其实已经是最早的、90年代的非常古老的方法了,后来也出现了一些优化性的计算思路和方法。因此,我打算先不急着跟各种教程在Unity中实现大气散射,而是再花时间来看看最近的游戏是如何去实现大气渲染的:06.游戏中地形大气和云的渲染(下)|GAMES104-现代游戏引擎:从入门到实践接下来就跟着GAMES104讲地形大气和云渲染的部分学习并做简单的记录,涉及到之前没提到的Mie散射也只选择直接截图PPT的方式记录啦!毕竟对于做作品来说,之后实现出来才是重要的~当然,May佬的
所以我看到unity支持c#、JS和Boo。我可以学习其中一个,但我想制作一个“编译器”或类似的东西,让我可以编写ruby代码并输出JS代码或制作一个可以被Unity编译器读取的层。这有可能吗?我愿意在这方面投入很多时间并且有相当多的经验。 最佳答案 如果您的问题实际上是“我如何将Ruby编译为JavaScript”,那么这更容易回答:Opal:RubytoJavaScriptcompiler但是,学习其中一种受支持的语言会更好。当运行的是用另一种语言解释的代码时,很难调试“您的”代码。
1.Scenes游戏场景文件夹用于放置unity的场景文件 2.Plugins插件文件夹用于放置unity的依赖文件,例如dll 3.Scripts脚本文件夹用于放置unity的c#脚本文件 4.Resources游戏资源文件夹用于放置unity的各种游戏资源,比如images,prefabs,同时只有放到Resources文件夹的游戏资源才能使用Resource.load(资源路径不加后缀)加载到游戏内存中进行使用 5.EditorUnity编辑器扩展脚本文件夹usingUnityEditor;这个名称空间就是Unity编辑器的名称空间这个名称空间提供了扩展Unity编辑器的各种类 【你所有