Как изменить изображение спрайта? [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 Как изменить изображение спрайта? [закрыто]

Сообщение Anonymous »

Я разрабатываю мод для игры «кислород не включен». < /p>
Мое ожидание - иметь совершенно новое здание и меню с 8 кнопками в меню. Нажатие кнопки изменит цвет. Предыдущие функции были реализованы, но функция «Цвет изменения кнопки» не может быть реализована после многих попыток. 2: изображения загружаются правильно.using HarmonyLib;
using KMod;
using KSerialization;
using LaserHeater;
using PeterHan.PLib.Core;
using PeterHan.PLib.Database;
using PeterHan.PLib.PatchManager;
using PeterHan.PLib.UI;
using STRINGS;
using System;
using System.Collections.Generic;
using System.IO;
using TUNING;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using static System.Net.Mime.MediaTypeNames;
public static class StringUtils
{
public static void AddBuildingStrings(
string buildingId,
string name,
string description,
string effect)
{
Strings.Add($"STRINGS.BUILDINGS.PREFABS.{buildingId.ToUpperInvariant()}.NAME", STRINGS.UI.FormatAsLink(name, buildingId));
Strings.Add($"STRINGS.BUILDINGS.PREFABS.{buildingId.ToUpperInvariant()}.DESC", description);
Strings.Add($"STRINGS.BUILDINGS.PREFABS.{buildingId.ToUpperInvariant()}.EFFECT", effect);
}

public static void AddStatusItemStrings(string id, string prefix, string name, string tooltip)
{
Strings.Add($"STRINGS.{prefix.ToUpperInvariant()}.STATUSITEMS.{id.ToUpperInvariant()}.NAME", name);
Strings.Add($"STRINGS.{prefix.ToUpperInvariant()}.STATUSITEMS.{id.ToUpperInvariant()}.TOOLTIP", tooltip);
}

public static void AddSideScreenStrings(string key, string title, string tooltip)
{
Strings.Add($"STRINGS.UI.UISIDESCREENS.{key.ToUpperInvariant()}.TITLE", title);
Strings.Add($"STRINGS.UI.UISIDESCREENS.{key.ToUpperInvariant()}.TOOLTIP", tooltip);
}
}

public static class BuildingUtils
{
private static PlanScreen.PlanInfo GetMenu(HashedString category)
{
foreach (PlanScreen.PlanInfo menu in TUNING.BUILDINGS.PLANORDER)
{
if (menu.category == category)
return menu;
}
throw new Exception("The plan menu was not found in TUNING.BUILDINGS.PLANORDER.");
}

public static void AddBuildingToPlanScreen(
string buildingID,
HashedString category,
string addAferID = null)
{
List data = BuildingUtils.GetMenu(category).data;
if (data == null)
return;
if (addAferID != null)
{
int num = data.IndexOf(addAferID);
if (num == -1 || num == data.Count - 1)
data.Add(buildingID);
else
data.Insert(num + 1, buildingID);
}
else
data.Add(buildingID);
}

public static void AddBuildingToTech(string buildingID, string techID)
{
Db.Get().Techs.Get(techID)?.unlockedItemIDs.Add(buildingID);
}
}

namespace LaserHeater
{
public class LaserHeaterConfig : IBuildingConfig
{
public const string ID = "LaserHeater";
public const string NAME = "Laser Heater";
public const string DESC = "Laser Heater TEST";
public const string EFFECT = "I DON'T KNOW";
public override BuildingDef CreateBuildingDef()
{
int width = 1;
int height = 2;
string anim = "LaserHeater_kanim";
string[] MaterialCategory = new string[1] { "DIAMOND" };

int hitpoints = 30;
float construction_time = 30f;
float[] construction_mass = new float[1] { 1f };
float melting_point = 9999f;
BuildLocationRule build_location_rule = BuildLocationRule.Anywhere;
EffectorValues none = NOISE_POLLUTION.NONE;
BuildingDef buildingDef = BuildingTemplates.CreateBuildingDef("LaserHeater", width, height, anim, hitpoints, construction_time, construction_mass, MaterialCategory, melting_point, build_location_rule, TUNING.BUILDINGS.DECOR.PENALTY.TIER1, none);
buildingDef.Floodable = false;
buildingDef.AudioCategory = "Metal";
buildingDef.Overheatable = true;
buildingDef.Repairable = false;
buildingDef.Disinfectable = false;
buildingDef.Invincible = true;
buildingDef.LogicInputPorts = LogicOperationalController.CreateSingleInputPortList(new CellOffset(0, 0));
buildingDef.PowerInputOffset = new CellOffset(0, 0);
buildingDef.SceneLayer = Grid.SceneLayer.Building;
buildingDef.ForegroundLayer = Grid.SceneLayer.BuildingFront;
buildingDef.RequiresPowerInput = true;
buildingDef.SelfHeatKilowattsWhenActive = 100f;
buildingDef.EnergyConsumptionWhenActive = 1800f;
buildingDef.OverheatTemperature = 2000f;
buildingDef.DragBuild = true;
buildingDef.PermittedRotations = PermittedRotations.R360;

return buildingDef;
}

public override void ConfigureBuildingTemplate(GameObject go, Tag prefab_tag)
{
}
public override void DoPostConfigureComplete(GameObject go)
{
go.AddOrGet();
}
}

public class LaserHeaterSideScreen : SideScreenContent
{
private LaserHeater Heater;
private string selectedDirection = "N";
private List buttonObjects = new List();
private List arrowSprite_act = new List();
private List arrowSprite_inact = new List();
private List PButtons = new List();
protected override void OnPrefabInit()
{
base.OnPrefabInit();

string DllPath = this.GetType().Assembly.Location;
string imagePath = DllPath.Replace("LaserHeater.dll", "");
Debug.Log("LaserHeaterSideScreen Prefab Init Log," + imagePath);

var panel = new PGridPanel("ConfigPanel")
{
FlexSize = Vector2.one
};

// 添加3列和3行
panel.AddColumn(new GridColumnSpec());
panel.AddColumn(new GridColumnSpec());
panel.AddColumn(new GridColumnSpec());
panel.AddRow(new GridRowSpec());
panel.AddRow(new GridRowSpec());
panel.AddRow(new GridRowSpec());

string[] directions = { "NW", "N", "NE", "W", "E", "SW", "S", "SE" };
ColorStyleSetting mColor = ScriptableObject.CreateInstance();
int[] columns = { 0, 1, 2, 0, 2, 0, 1, 2 };
int[] rows = { 0, 0, 0, 1, 1, 2, 2, 2 };
for (int i = 0; i < 8; i++)
{
byte[] imageBytes = File.ReadAllBytes(imagePath + @"\assets\" + directions + "_ACT.png");
Texture2D tex = new Texture2D(2, 2);
tex.LoadImage(imageBytes);

arrowSprite_act.Add( Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f)));

byte[] imageBytes_inact = File.ReadAllBytes(imagePath + @"\assets\" + directions + "_INACT.png");
Texture2D tex_inact = new Texture2D(2, 2);
tex_inact.LoadImage(imageBytes_inact);
arrowSprite_inact.Add(Sprite.Create(tex_inact, new Rect(0, 0, tex_inact.width, tex_inact.height), new Vector2(0.5f, 0.5f)));

PButtons.Add(new PButton("DirectionButton" + i.ToString())
{
ToolTip = "Select direction " + directions,
Margin = new RectOffset(5, 15, 5, 15),
Color = mColor,
Sprite = arrowSprite_inact,
}
);

switch (i)
{
case 0:
PButtons.OnClick = OnButtonClick_NW;
break;
case 1:
PButtons.OnClick = OnButtonClick_N;
break;
case 2:
PButtons.OnClick = OnButtonClick_NE;
break;
case 3:
PButtons.OnClick = OnButtonClick_W;
break;
case 4:
PButtons.OnClick = OnButtonClick_E;
break;
case 5:
PButtons.OnClick = OnButtonClick_SW;
break;
case 6:
PButtons[i].OnClick = OnButtonClick_S;
break;
case 7:
PButtons[i].OnClick = OnButtonClick_SE;
break;

}
panel.AddChild(PButtons[i], new GridComponentSpec(rows[i], columns[i]));
buttonObjects.Add(PButtons[i].Build());
}
var content = panel.Build();
content.transform.SetParent(gameObject.transform, false);
ContentContainer = content;
}
private void OnButtonClick_NW(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(0);
Refresh();
}
}
private void OnButtonClick_N(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(1);
Refresh();
}
}
private void OnButtonClick_NE(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(2);
Refresh();
}
}
private void OnButtonClick_W(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(3);
Refresh();
}
}
private void OnButtonClick_E(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(4);
Refresh();
}
}
private void OnButtonClick_SW(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(5);
Refresh();
}
}
private void OnButtonClick_S(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(6);
Refresh();
}
}
private void OnButtonClick_SE(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(7);
Refresh();
}
}
public override void SetTarget(GameObject target)
{
base.SetTarget(target);
Heater = target.GetComponent();
this.Build();
}

private void Build() => this.Refresh();
public override bool IsValidForTarget(GameObject target)
{
Heater = target.GetComponent();
if (Heater != null)
{
Refresh();
return true;
}
return false;
}
protected override void OnSpawn()
{
base.OnSpawn();
}
private void Refresh()
{
if (Heater != null && PButtons.Count > 0)
{
int Dir = Heater.GetDirection();

for (int i = 0; i < 8; i++)
{

Sprite component = buttonObjects[i].GetComponent();

if (i == Dir)
{
component = arrowSprite_act[i];
Debug.Log("act:" + buttonObjects[i].name + ", sprite :" + component.ToString());
}
else
{
component = arrowSprite_inact[i];
Debug.Log("in_act:" + buttonObjects[i].name + ", sprite :" + component.ToString());
}
}
}
}

public override string GetTitle() => (string)"Set Direction";
}
public class LaserHeater : KMonoBehaviour
{
private bool[] Direction = {false, true, false, false, false, false, false, false };
protected override void OnSpawn()
{
base.OnSpawn();
}

public void Update()
{

}

public void SetDirection(int Dir)
{
for (int i = 0; i < 8; i++)
{
if (i == Dir)
Direction[i] = true;
else
Direction[i] = false;
}
}
public int GetDirection()
{
for (int i = 0; i < 8; i++)
{
if (Direction[i] == true)
return i;
}
return -1;
}
}
}

public class Patches : UserMod2
{
public override void OnLoad(Harmony harmony)
{
base.OnLoad(harmony);
PUtil.InitLibrary(false);
PUIUtils.AddSideScreenContent();
}

[HarmonyPatch(typeof(Db))]
[HarmonyPatch("Initialize")]
public class Db_Initialize_Patch
{
public static void Prefix()
{
Debug.Log("Add Building Pre Fix");
StringUtils.AddBuildingStrings("LaserHeater", (string)LaserHeater.LaserHeaterConfig.NAME, (string)LaserHeater.LaserHeaterConfig.DESC, (string)LaserHeater.LaserHeaterConfig.EFFECT);
}

public static void Postfix()
{
BuildingUtils.AddBuildingToPlanScreen("LaserHeater", (HashedString)"HEP");
BuildingUtils.AddBuildingToTech("LaserHeater", "NuclearResearch");
}
}

[HarmonyPatch(typeof(DetailsScreen), "OnPrefabInit")]
public static class DetailsScreen_Patch
{
public static void Postfix()
{
PUIUtils.AddSideScreenContent();
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... rite-image
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»