Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单击按钮更改数据_C#_Unity3d - Fatal编程技术网

C# 单击按钮更改数据

C# 单击按钮更改数据,c#,unity3d,C#,Unity3d,我在一些游戏对象中有一些功能。 当在游戏中购买升级时,需要更改这些功能。问题是每个函数都是在自己的对象上设置的 第一个问题是,当我点击按钮时,变量不会改变。正如您所看到的,我已经为按钮添加了一个onclick值,说明当按钮被单击时。该值应该更改 这里的问题是“对象引用未设置为实例” 我面临的第二个问题是,每一发子弹都是独立发射的。所以如果我改变1的静态伤害,它就不会转移到其他射弹上 升级菜单 using System.Collections; using System.Collections

我在一些游戏对象中有一些功能。 当在游戏中购买升级时,需要更改这些功能。问题是每个函数都是在自己的对象上设置的

第一个问题是,当我点击按钮时,变量不会改变。正如您所看到的,我已经为按钮添加了一个onclick值,说明当按钮被单击时。该值应该更改

这里的问题是“对象引用未设置为实例”

我面临的第二个问题是,每一发子弹都是独立发射的。所以如果我改变1的静态伤害,它就不会转移到其他射弹上

升级菜单

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UpgradeMenu : MonoBehaviour
{
    [SerializeField]
    private Text accuracyText;

    [SerializeField]
    private Text speedText;

    [SerializeField]
    private Text damageText;

    [SerializeField]
    private float accuracyMultiplier = 0.7f;

    private Weapon weapon;
    private Projectile projectile;
    private Player player;

    void OnEnable()
    {
        UpdateValues();
    }

    void UpdateValues ()
    {
      accuracyText.text = weapon.randomAngle.ToString();
      damageText.text = projectile.DamageOnHit.ToString();
      speedText.text = player.MaxRun.ToString();

    }

    public void UpgradeAccuracy ()
    {
      weapon.randomAngle = (int)weapon.randomAngle * accuracyMultiplier;
      UpdateValues();
    }

    public void UpgradeDamage ()
    {
      projectile.DamageOnHit = (int)projectile.DamageOnHit + 1;
      UpdateValues();
    }
}
射弹(损坏脚本)

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
//[RequiredComponent(typeof(Rigidbody2D))]
公共类射弹:单一行为{
[标题(“速度”)]
公众浮动基准速度;
公共交通速度;
公共矢量2速度v2;
公共矢量2方向;
[标题(“损坏”)]
公众伤害;
[标题(“层”)]
公共层MASK solid_层;
公共层任务实体_层;
[标题(“OnHit FX”)]
公共游戏对象HITFX预制;
公共游戏对象;
[标题(“反弹”)]
公共bool BounceOnCollide=false;
公共int bouncesLeft=0;
[hideininstecpt]
公共卫生所有者;//射弹的所有者
私有向量2位置;//当前位置
私有Vector2 movementCounter=Vector2.zero;//子像素移动计数器
公共包装箱;R2D myCollider;
List healthsDamaged=new List();//用于存储损坏的健康的列表
碰撞无效(碰撞后的R2D列,布尔水平列=真){
var component=col.GetComponent();
//如果与hitbox碰撞的目标具有健康组件,并且它不是我们的所有者,并且它不在当前hitbox损坏的健康列表中
if(component!=null&&component!=owner&&healthsDamaged.Contains(component)){
//将健康组件添加到受损健康列表中
healthsDamaged.Add(组件);
//施加损害
var didDamage=组件损坏(损坏命中);
//造成伤害后摧毁射弹
如果(损坏){
毁灭我();
返回;
}
}
//如果弹丸击中的是固体物体,摧毁它
if(col.gameObject.layer==(int)Mathf.Log(solid\u layer.value,2)){
破坏mewall();
返回;
}
}
碰撞实体上的无效(碰撞后的R2D列){
var component=col.GetComponent();
//如果与hitbox碰撞的目标具有健康组件,并且它不是我们的所有者,并且它不在当前hitbox损坏的健康列表中
if(component!=null&&component!=owner&&healthsDamaged.Contains(component)){
//将健康组件添加到受损健康列表中
healthsDamaged.Add(组件);
//施加损害
var didDamage=组件损坏(损坏命中);
//造成伤害后摧毁射弹
如果(损坏){
毁灭我();
}
}
}
首先,更改

[Header ("Damage")]
public int DamageOnHit;
静止

public static int DamageOnHit = /*your starting value*/;
这可以确保所有射弹在命中时都会受到相同的伤害。
例如,如果当前场景中有10个投射物,并且
DamageOnHit
为2,则它们都将造成2点伤害

如果没有
静态
,每个射弹都会有自己的
损伤命中
。这也让我们进入下一个案例:

如果每个射弹都有自己的
DamageOnHit
,并且我们想要修改
DamageOnHit
,我们需要指定要修改的射弹伤害。
但是如果它是静态的,它会变得简单得多,因为所有投射物共享相同的
DamageOnHit

现在,如果您想更改所有投射物的
DamageOnHit
,只需执行以下操作即可

Projectile.DamageOnHit = /*Your new damage value*/
此外,由于您从未在
升级菜单中分配
投射物
,因此发生了
空引用异常
(请注意,您从未在
UpgradeMenu.cs
?)中执行过
sparket=/*您的sparket*/

默认情况下,这将使变量为null。尝试执行
null.DamageOnHit+=1
将毫无意义


小编辑:创建一个静态变量也意味着您不能将其公开给检查器。但是您可以像最初显示的代码那样指定一个起始值。

在这种情况下,有许多空引用异常问题可能会有所帮助,但很难从中找出实际问题。您可以ave一个确实存在的对象,或者方法中的值为null。您的第二个问题显示未更改任何静态值。这是更改一个对象中属性值时的预期行为。您好@Kaynn谢谢您的回答!我尝试适应您的脚本,并已将DamageOnHit更改为静态。我只是不明白下面的
是什么意思(注意你怎么从来没有在UpgradeMenu.cs中使用sparket=/*你的sparket*/呢?
你能详细解释一下吗?@mafiaf我说“你从来没有分配过你的
sparket
变量,因此默认情况下它变成了
null
”关于这一点。我只是不知道如何分配投射变量。使用以下
私有投射投射;
来访问所有粒子是否足够?或者我是否必须在游戏对象上分配投射?因为游戏对象仅在我单击(射击)时生成。所以我无法分配它,因为游戏对象不是ingame。@Mafia如果您的类型是<代码
Projectile.DamageOnHit = /*Your new damage value*/