我需要这个来更改音量的文本,如果玩家在按钮中按下右键,那么文本会更改为与音量对应的文本,或者向左,我不知道该怎么做。或者至少需要研究什么,只是不清楚它是如何连接的,与什么连接,它似乎与事件系统连接,但如何安排它并不清楚
danil2283376's questions
情况是这样的,我需要一个按钮(UI Button),以便我可以使用 enter 和 space 作为按钮单击处理程序(UI Button),我有一组按钮(UI Button),我只能在其上向前切换或通过事件系统设置的键盘上的后退按钮(W、S 或箭头),但我不知道如何制作 OnClick 位置处理程序,以便按钮(UI 按钮)也只对 Space 和 Enter 做出反应,因为默认情况下,它只对键盘上的空格作出反应,但对我来说,在 Enter 上也是必要的。where你也可以通过Enter添加一个按钮点击(UI Button),因为通过Space也是一样的点击。我只需要在键盘上使用额外的 Enter 按钮来处理按钮(UI 按钮)的点击。
也许在输入管理器中,您可以在某处添加一个额外的 Enter 按钮?
太好了,他们只是做了 Enter 是 return,而 NumPad 上的 Enter 是 enter,胡说八道为什么这么不合逻辑,这就是全部答案,您只需要了解 Enter 是 return
找到了一个类似的相关 Google API:https ://medium.com/@jonfoust/using-gcp-nuget-packages-with-unity-8dbd29c42cc4 。与我的错误完全相同,即未找到 using 指令。我确实做到了,我做了一切,错误消失了,但是在项目启动的时候,整个项目就卡住了,我不明白问题是什么。
接下来,我描述一下我在阅读类似内容时所做的事情使用谷歌 API:
将 Class Qiwi.BillPayments.dll 从 Packages 文件夹复制到 Plugin 类。
添加link.xml时
我是在项目中添加link.xml的时候做的,可能这里有问题,没看懂
<?xml version="1.0" encoding="utf-8"?>
<linker>
<assembly fullname ="Qiwi">
<type fullname ="Qiwi.BillPayments" preserve ="all"/>
</assembly>
</linker>
请帮忙,我真的很想弄清楚这个!
C#有这样的文件夹bin -> Debug -> file.txt。它的路径不需要完整输入,但编译器会在Debug中寻找自己。而在Unity中如何找到这个文件而不输入完整路径,而只输入txt文件的名称。
// СОЗДАНИЕ ФОРМЫ
var client = BillPaymentsClientFactory.Create(
secretKey: "eyJ2ZXJzaW9uIjoiUDJQIiwiZGF0YSI6eyJwYXlpbl9tZXJjaGFudF9zaXRlX3VpZCI6IjU5Z29icC0wMCIsInVzZXJfaWQiOiI3OTI3NDI1NTQ1MCIsInNlY3JldCI6ImZiZmM1YmQ4NDViYTU0YTlhNmZmYmNlMzQ4OTQ3Mzc3OTk0ZThiN2FhNDg5YjZjYTk0ODU1NjRkNz**********");
var billid = Guid.NewGuid().ToString();
var paymentUrl = client.CreatePaymentForm(
paymentInfo: new PaymentInfo
{
PublicKey = "48e7qUxn9T7RyYE1MVZswX1FRSbE6iyCj2gCRwwF3Dnh5XrasNTx3BGPiMsyXQFNKQhvukniQG8RTVhYm3iP5iruAUULBX8EKZ3M57hheY214uMDEXk8Vi2tikH3XDHbi9PJBd5M4eojL1Myj2YotX25Poh4S8cZzuVz9H1135Bys*************",
Amount = new MoneyAmount
{
ValueDecimal = 1.1m,
CurrencyEnum = CurrencyEnum.Rub
},
BillId = billid/*Guid.NewGuid().ToString()*/,
//SuccessUrl = "https://merchant.com/payment/success?billId=893794793973"
}
);
var response = client.GetBillInfo(billid);
Console.WriteLine(response);
通过 NuGet 链接的库:
using Qiwi.BillPayments.Client;
using Qiwi.BillPayments.Model.In;
using Qiwi.BillPayments.Model;
我创建了一个用户必须通过并付款的表单,我想通过这个表单获取付款状态,表单本身是正常创建的,我得到了它的链接,但我不明白如何检查付款地位。 Qiwi通过 .NET SDK获得如下交易状态: https ://developer.qiwi.com/en/bill-payments/?csharp#invoice-status。帮我从 QIWI 服务器获得此响应:不想插入代码:这里https://github.com/QIWI-API/bill-payments-dotnet-sdk 滚动到帐户信息。服务器返回给我这个: Qiwi.BillPayments.Model.Out.BillResponse 不是我需要的。我将由衷感谢,我已经担心了很长时间
解决方案:
// СОЗДАНИЕ ФОРМЫ
BillPaymentsClient client = BillPaymentsClientFactory.Create(
secretKey: "eyJ2ZXJzaW9uIjoiUDJQIiwiZGF0YSI6eyJwYXlpbl9tZXJjaGFudF9zaXRlX3VpZCI6IjU5Z29icC0wMCIsInVzZXJfaWQiOiI3OTI3NDI1NTQ1MCIsInNlY3JldCI6ImZiZmM1YmQ4NDViYTU0YTlhNmZmYmNlMzQ4OTQ3Mzc3OTk0ZThiN2FhNDg5YjZjYTk0ODU1N**************"
);
BillResponse form = client.CreateBill(
info: new CreateBillInfo
{
BillId = Guid.NewGuid().ToString(),
Amount = new MoneyAmount
{
ValueDecimal = 199.9m,
CurrencyEnum = CurrencyEnum.Rub
},
Comment = "comment",
ExpirationDateTime = DateTime.Now.AddDays(45),
Customer = new Customer
{
Email = "danil*************@bk.ru",
Account = Guid.NewGuid().ToString(),
Phone = "892742*****"
},
}
);
BillResponse responseStatus = client.GetBillInfo(billId: form.BillId);
string status = responseStatus.Status.ValueString;
Customer customer = form.Customer;
Console.WriteLine(status);
如何将物体从 A 点移动到 B 点,到达该点后,等待一段时间,然后再从 B 点移动到新的点。
我想让物体移动到一个点然后静止一段时间,然后再移动到另一个点,这无法理解,我为此折磨了很长时间。请帮帮我。对象只是逐点传送。物体必须顺利到达目的地,在那里等待一段时间,然后再次移动
公共类协程:MonoBehavior
{
// стартовая позиция
private Vector3 startPosition;
// новая позиция объекта
private Vector3 newPoint;
private void Start()
{
// даю начальную позицию
startPosition = transform.position;
}
private void Update()
{
// указываю новую точку рандомными координатами, от начальной точки
newPoint = new Vector3(
Random.Range(startPosition.x - 5, startPosition.x + 5),
startPosition.y,
Random.Range(startPosition.z + 5, startPosition.z - 5)
);
// запускаю корутину
StartCoroutine(MoveCoroutine(newPoint));
}
private IEnumerator MoveCoroutine(Vector3 moveTo)
{
// жду 2 сек
yield return new WaitForSeconds(2f);
// если позиция объекта не равна конечной точки
if (transform.position != newPoint)
{
// телепортирую объект по отрезку, создавая иллюзию перемещения
transform.position = Vector3.Lerp(transform.position, newPoint, Time.time / 0.5f);
}
}
}
想用:
Physics.IgnoreCollision(gameObject.GetComponent<Collider2D>(), enemy.GetComponent<Collider2D>(), true); // где gameObject - это игрок, а enemy противник при столкновении.
该代码不起作用,因为我对 3D 空间的理解。
如何让玩家在碰撞期间不对敌人做出反应并且不旋转玩家,如何禁用此物理
当脚本启动时,我用脚本附加到的对象的子项填充 List,然后在 Update 方法中我尝试找出 1 个元素是否已移到相机后面的左侧,然后检查它是否是正在绘制,之后我得到列表的最后一个元素,找出它的位置并传递 1 个已经离开相机的元素,场景中最后一个元素的位置,以便它出现在它后面,之后我删除 1元素并将其添加到列表的末尾。但是一切都不行,或许还有别的方法可以循环后台,请大家帮忙
public class LoopBackGround : MonoBehaviour
{
public Vector2 speed = new Vector2 (10, 10);
public Vector2 direction = new Vector2 (-1, 0);
private List<Transform> backgroundPart; // все дети которые пренадлежат элементe на который присоединил скрипт
public bool isLooping = false;
public bool isCamera = false;
private int steps = 0;
private void Start()
{
if (isLooping) // надо ли элемент зациклить
{
backgroundPart = new List<Transform>(); // инициализирую List
for (int i = 0; i < gameObject.transform.childCount; i++)
{
Transform child = transform.GetChild(i);// получая ребенка элемента
if (child.GetComponent<Renderer>() != null) // узнаю есть ли у него компонент рендера
{
backgroundPart.Add(child);// добавляю в List
}
}
backgroundPart = backgroundPart.OrderBy(t => t.position.x).ToList();
}
}
private void Update()
{
Vector3 move = new Vector3(speed.x * direction.x, speed.y * direction.y, 0); // задаю движение элементу
move *= Time.deltaTime; // Умножаю ее на скорость отрисовки кадра
transform.Translate(move); // Передвигаю элемент
if (isCamera) // Это камера ?
Camera.main.transform.Translate(move); // Если да то двигаю камеру
if (isLooping) // Элемент надо зациклить ?
{
/*Vector3 cam = Camera.main.transform.position;*/ // Узнаю координаты камеры
Transform firstChild = backgroundPart.FirstOrDefault(); // получаю 1 элемент
if (firstChild != null) // узнаю не пустой ли 1 элемент
{
for (int i = 0; i < backgroundPart.Count; i++)
{
if ((firstChild.position.x + 20) < Camera.main.transform.position.x) // проверяю ушел ли объект налево
{
if (firstChild.GetComponent<Renderer>().isVisible == false)
{
print(firstChild.gameObject.name);
Transform lastChild = backgroundPart.LastOrDefault(); // получаю последний объект List
print(lastChild.gameObject.name);
firstChild.transform.Translate(new Vector3(lastChild.position.x, lastChild.position.y, lastChild.position.z)); // получаю место нахождение последнего элемента и передаю его первому
backgroundPart.Add(firstChild); // добавляю в List первый элемент
backgroundPart.Remove(firstChild); // удаляю первый элемент что бы двигать список справо налево
//print(backgroundPart[i].gameObject.name);
//lastElem = new Vector3(gameObjects.LastOrDefault().transform.position.x + 40, 0, 0);
//Transform first = gameObjects.FirstOrDefault(); // передаю элемент который ушел налево
//gameObjects[i].transform.Translate(lastElem); // Переношу элемент направо
//gameObjects.Add(first); // Добавляю первый элемент в конец
//gameObjects.Remove(first); // Удаляю первый элемент
//Transform lastChild = backgroundPart.LastOrDefault();
//Vector3 lastPosition = new Vector3(lastChild.transform.position.x, lastChild.transform.position.y, lastChild.transform.position.z);
//Vector3 lastSize = (lastChild.GetComponent<Renderer>().bounds.max - lastChild.GetComponent<Renderer>().bounds.min);
//firstChild.position = new Vector3(lastPosition.x + lastSize.x, firstChild.position.y, firstChild.position.z);
//backgroundPart.Remove(firstChild);
//backgroundPart.Add(firstChild);
}
}
}
}
}
steps++;
print($"{steps}) Проверка порядка элементов!");
for (int i = 0; i < backgroundPart.Count; i++)
{
print(backgroundPart[i].gameObject.name);
}
// СПИСОК НЕ ОБНОВЛЯЕТСЯ, 1 ЭЛЕМЕНТ ПЕРЕНОСИТСЯ В КОНЕЦ ОСТАЛЬНЫЕ НЕ ПЕРЕНОСЯТСЯ
}
}