Unity2D官方入门教程 Ruby' Adventure 完整版~
喵子vs小哼:
“首先打开vs2019(或你用的那版)->工具->获取工具和功能->单个组件(到游戏那一栏)->Visual Studio Tools for Unity(勾选上)->单击“修改”;
然后打开unity->Edic->Preferences->External Tools->External Script Editor -> 找到vs编辑器的exe选中“确定”;
再次打开时cs脚本时会让重载,选中重载就好了。”
以上是我搜到的大佬的回答,亲测可用,解决了环境配置的问题,不要卡在这里了。
【回复】啊这,我刚下unity闲的时候打开vs看见只能创建c++项目,以前写的winFrom项目运行不了,我就百度怎么删除用不到的组件和下载组件,顺手我就把unity勾上了,没想到帮自己避了个坑哈哈
shang花白夏:
1,《如何使用unity开发坦克大战》:av29751762
2,《如何使用unity制作塔防游戏》:av29784743
3,《如何使用unity开发古迹探险》:av29790162
4,《如何使用FairyGUI》:av29751288
5,《如何使用unity开发甜品消消乐》:av29791086
6,《如何使用unity开发愤怒的小鸟》:av35565116
7,《如何使用unity开发吃豆人》:av36103586
8,《如何使用unity开发捕鱼达人》:av36334499
9,《如何使用unity开发换装系统》:av38063048
10,《如何使用EasyTouch5插件》:av36956262
十一捉一:
up你做的真的很棒(๑•̀ㅂ•́)و✧!我真是太喜欢这种模仿着学习再自己进行一些改进的学习方式了。等我全部看完了把我自己做的录个视频发上来,up你要来看哦~(虽然可能还需要很久,毕竟我现在很摸鱼。而且我差不多看你的视频一两分钟就要自己捣鼓半个小时再继续看。)
【回复】加油,现在学习的进度虽然慢,但是只要坚持下去,会越来越熟练。发了视频一定去看。
【回复】回复 @太古白话诺十一 :好哒!
赶画中的十三:
玩家脚步声可以直接添加音频组件,通过判断是否移动来开关音频播放
AudioSource ads;
void update(){
float moveX = Input.GetAxisRaw("Horizontal");//水平方向 A:-1 ,D: 1. 无输入返回0.
float moveY = Input.GetAxisRaw("Vertical");//垂直方向 W:1,S:-1.无输入返回0.
Vector2 moveVector = new Vector2(moveX, moveY);
if (moveVector.x != 0 || moveVector.y != 0)
{
lookDircetion = moveVector;
}
animplayer.SetFloat("Look X", lookDircetion.x);
animplayer.SetFloat("Look Y", lookDircetion.y);
animplayer.SetFloat("Speed", moveVector.magnitude);//magnitude:移动量
Vector2 position = rbody.position;//获取玩家当前自身位置。
position += moveVector * Speed * Time.deltaTime;
if (moveX != 0 || moveY != 0 )//判断是否在移动
{
ads.enabled = true;//在动,播音乐
}
else
{
ads.enabled = false;//没动,关掉
}
}
【回复】回复 @洋葱头盖1 :空指针是因为没有用getcomponent获取audiosource组件
【回复】报错,空指针
NullReferenceException: Object reference not set to an instance of an object
UnityEditor.Graphs.Edge.WakeUp () (at <1bfd5359178446f5b1ac53f68c0a5db0>:0)
UnityEditor.Graphs.Graph.DoWakeUpEdges (System.Collections.Generic.List`1【T】 inEdges, System.Collections.Generic.List`1【T】 ok, System.Collections.Generic.List`1【T】 error, System.Boolean inEdgesUsedToBeValid) (at <1bfd5359178446f5b1ac53f68c0a5db0>:0)
UnityEditor.Graphs.Graph.WakeUpEdges (System.Boolean clearSlotEdges) (at <1bfd5359178446f5b1ac53f68c0a5db0>:0)
UnityEditor.Graphs.Graph.WakeUp (System.Boolean force) (at <1bfd5359178446f5b1ac53f68c0a5db0>:0)
UnityEditor.Graphs.Graph.WakeUp () (at <1bfd5359178446f5b1ac53f68c0a5db0>:0)
UnityEditor.Graphs.Graph.OnEnable () (at <1bfd5359178446f5b1ac53f68c0a5db0>:0)
我是猪中007:
第八讲,设置陷阱,我觉得up主用无敌时间不恰当,因为无敌时间一般是玩家重生获得一次性的,而up呈现的是玩家走进陷阱,两秒掉一滴血,我觉得可以用步进计时的概念来理解,即两秒计时,掉一滴血
将invincibleTime 理解为步长/buchang
将invincibleTimer理解为钟表,即计时倒计时/zhongbiao
将Isinvincible理解为中标开关,即是否开始计时/kaiguan
update(){
//===============检测开关是开还是关,如果是开则按照步进计时,一个步进结束关闭开关===================
if (kaiguan == true)
{
zhongbiao -= Time.deltaTime;
if (zhongbiao < 0)
{
kaiguan = false;
}
}
}
public void ChangeHealth(int amount) {
//==========检测走进了陷阱,先检测开关是否打开,如果打开,减少血量,计时,直到下一次开关打开
if (amount<0)
{
if (kaiguan ==true)
{
return;
}
kaiguan = true;
zhognbiao = buchang;
}
CurrentHealth = Mathf.Clamp(CurrentHealth + amount, 0, MaxHealth);
}
刚理解的时候我发现update和changehealth之间貌似没什么关系,
但别忘记在第一次执行changehealth之后开关会再次打开,并赋予步长,这就是两者之间的关系。
【回复】我觉得up主的讲法挺好的。一般受伤之后不就是会有硬直吗,那段时间不就是无敌的吗?invincibleTime是需要你自己设置的无敌时间,invincibleTimer是一个计时器,isInvincible代表是否无敌的状态。我觉得挺好理解的,不用特意改成其他的名称。反倒你这个,“走进了陷阱,检测开关是否打开”。???我觉得不太符合逻辑。说句不好听一点的话,难道受伤是可以自己控制的吗?“我开启了我的受伤开关,我可以受到伤害了。然后我受到伤害了,好疼,我要把我的受伤开关关掉2秒钟,2秒之后再好好感受疼痛吧~”这个样子?
【回复】用计时器我觉得不好,因为连续性的伤害,用这个无敌肯定不合适,我多加了伤害类型的判断,就很容易了。
【回复】回复 @十一捉一 :看个人理解吧,我把三个参数换成定时理解也可以啊,实现的效果也是每隔几秒掉一滴血,没毛病。😁
smile_god:
UP我跟着写为什么控制台没有输出log
void OnTrigerEnter2D(Collider2D other)
{
PlayerController pc = other.GetComponent<PlayerController>();
if (pc != null)
{
Debug.Log("123");
}
}
}
【回复】不是因为trigger打错成triger了嘛[思考]
【回复】UnityEngine.Debug.Log(“123”);本人不懂代码,我也和你出了一样的问题,我把代码改成这样,就可以了。具体什么原因,由于代码小白完全不懂。
【回复】你的脚本没绑定到角色上
StupidSeaside:
我写完这个课设了,有需要的同学可以看我的博客[打call]
https://blog.csdn.net/weixin_43673589/article/details/106577768
【回复】另外,请问大佬有没有写这个案例的发射子弹、显示血条的具体代码和教学内容?如果有的话,给一个链接吧,谢谢了。
【回复】回复 @深南大道10000号 :感谢大佬!
此间唯笑:
唔,登录界面怎么做?直接进入游戏有点突然啊
【回复】我想知道怎么退出游戏[笑哭]
毅力帝帝蒂:
角色动画操作这一块从官方教程复制过来的:
(仅供参考)
单击Moving 和Idle 之间的向下箭头,然后查看Inspector 以查看该Transition 的设置:
大多数设置(如图表上的条形图)对于可以混合动画的3D 非常有用。在2D中,只有一对对我们有用。
请注意,取消选中“ 退出时间” 。这意味着移动动画不会等到状态机进入空闲动画之前完成,它会立即改变。
最重要的部分是底部的条件部分。一个转型将发生两个情况:
如果没有条件,则转换将在动画结束时发生。在这里,它无法工作,因为我们的动画是循环的,但是如果你看一下从Hit 到Idle 的转换,那就是正在发生的事情:勾选退出时间,并且没有设置条件,这意味着命中动画将播放一次然后转换回空闲状态。
或者,我们可以根据您的参数设置条件。这里,如果机器人的速度小于0.1,那么状态机将从移动到空闲。
您可以单击其他过渡以查看它们并查看它们的工作方式。
您可能想知道为什么Hit 参数在Parameters 列表中看起来不同。那是因为它不是浮动的。被击中不是像运动或速度那样的“数量”,而是一次性事件。
这种类型的参数称为“触发器” 。如果您使用该参数作为Transition 的条件,则如果从代码激活Trigger ,则会发生Transition (在我们的情况下,当角色被击中时)。
只收狂徒:
为什么在create中没有tile选项,而且package manager的tilemap editor也已经安装了@诺十一2021
【回复】兄弟,直接接着做就行,后面发现不需要这一步
转身的一瞬萧条的一生:
https://learn.unity.com/tutorial/main-character-and-first-script?language=en&projectId=5c6166dbedbc2a0021b1bc7c#5cda8a84edbc2a05c8687534
原官方教程在这,这个视频教程的p2跟着做一下,然后看官方教程学习更好。
【回复】up主的内容少了一个创建ruby的scripts。所以建议官方教程和这个对照着看。
【回复】安装的话 安装 unity Hub
编辑器选择vs code 因为vs太卡了。
然后将unity默认编辑器换成 vs code
【回复】回复 @转身的一瞬萧条的一生 :[OK]
Jack_Boyd:
可不可以公布一下脚本的源代码[doge][doge][doge]@太古白话诺十一
辽宁第一狠人:
我在PlayerController脚本中设置完rBody.MovePosition(position)后,角色的移动速度比之前设置的transform慢了很多,我的speed是5没改过,咋回事呀
【回复】用这个: moveX = Input.GetAxisRaw ("Horizontal");
moveY = Input.GetAxisRaw("Vertical");
transform.Translate(moveX * Time.deltaTime* ruby_Speed, moveY * Time.deltaTime * ruby_Speed, 0);
上面的写法是最常用的,position
【回复】因为刚体移动是有摩擦的,所以最好写在FixedUpdate里,会好很多,虽然会掉帧
【回复】回复 @lion73 :https://www.jianshu.com/p/004c3e00aeec
梅花六七:
自带的计时器实现无敌比较好管理
public abstract class Character : Mover
{
// 基础属性
private int maxHealth = 100;
private int currentHealth;
private int attackValue = 20;
private int defenseValue = 5;
// 无敌标记
private bool isInvincible = false;
// 无敌时间
private float invincibleTime = 2f;
// 攻击
public virtual void Attack(Character npc)
{
// 无敌检测
if (!npc.IsInvincible)
{
npc.Attacked(this);
}
}
// 被攻击
protected virtual void Attacked(Character npc)
{
int hurt_value = Mathf.Max(npc.attackValue - defenseValue, 1);
currentHealth = Mathf.Clamp(currentHealth - hurt_value, 0, maxHealth);
// 开启无敌
isInvincible = true;
// 接触无敌计时
Invoke("UnInvincible", invincibleTime);
}
// 解除无敌
protected void UnInvincible()
{
isInvincible = false;
}
}
【回复】Attacked 和 Attack两个方法
Attacked 保护起来 防止外部调用
比如两个继承自Character的类A和B
A攻击B时只需要A.Attack(B)
如果要设置反伤之类的想法可以在Attacked内操作
安都奕雨:
我原原本本地跟着up的步骤做可是相机边界是以照相机中心不能越过polygon边界而不是相机边缘不能越过该边界,即还是会超出设定的边界。我观察了我并没有confine screen edge选项,请问Up是修改了cinemachine confiner的脚本吗?
【回复】回复 @送豆腐的店员 :调整了,但还是不行
【回复】你解决了嘛我有那个选项还是没有效果
【回复】请问你改好了吗我也是咋找找不到
夏佑beta:
P8第一次写脚本的时候有个PlayerController在VS2017里面没有啊啊啊啊
怎么办
求大神指教[tv_流泪]
【回复】那个playercontroller是自己创建的。具体方法在角色移动那一P里。
【回复】回复 @送豆腐的店员 : 感谢!我被那一步卡蒙了,看了你的解释立马改好了!谢谢[脱单doge]
【回复】重新学习,已经解决,谢谢各位
神户柳一:
不理解了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
public float speed = 5f;//移动速度
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
float moveX = Input.GetAxiRaw("Horizontal");
float moveY = Input.GetAxiRaw("Vertical");
Vector2 position = transform.position;
position.x += moveX * speed * Time.deltaTime;
position.x += moveY * speed * Time.deltaTime;
transform.position = position;
}
}
17行29出现字符文本中的字符太多
18行29出现字符文本中的字符太多
这怎么解决我的C# 没有标红
怎么unity怎么就报错了
【回复】float moveX = Input.GetAxisRaw("Horizontal");
float moveY = Input.GetAxisRaw("Vertical");
GetAxiRaw应该加个s