抛射物不移动,也不从玩家开始(Unity 2D / C#)
Projectiles not moving, and not starting from the player (Unity 2D / C#)
信息
所以我正在尝试制作一款自上而下的无尽竞技场战斗游戏,你的盾牌也可以作为你的进攻手段。盾牌应该在玩家前方生成,并在玩家移动和旋转时保持在前方(同时按住 mouse1(确实如此))。一旦mouse1被释放,盾牌应该像弹丸一样向前发射。
问题
但是,当mouse1被释放时,盾牌向前移动一点然后冻结,但无论玩家在哪里,他们移动就像玩家在 0, 0.
(我知道这是有点混乱,所以这是一张照片:)
(三角形是玩家)
CODE
这是我的播放器控制器脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public Rigidbody2D rb;
public GameObject Shield;
public float moveSpeed = 4.3f;
public float sheildSpeed = 2f;
Vector2 movement;
bool isDead = false;
void Update()
{
movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");
Vector3 mouseScreen = Input.mousePosition;
Vector3 mouse = Camera.main.ScreenToWorldPoint(mouseScreen);
transform.rotation = Quaternion.Euler(0, 0, Mathf.Atan2(mouse.y - transform.position.y, mouse.x - transform.position.x) * Mathf.Rad2Deg - 90);
if (Input.GetMouseButtonDown(0)) {
Shield = Instantiate(Shield, transform.position + transform.forward + transform.up, transform.rotation);
Shield.transform.parent = transform;
}
if (Input.GetMouseButtonUp(0)) {
Shield.transform.parent = null;
}
}
void FixedUpdate() {
if (!isDead) {
rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
}
}
}
这是护盾脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShieldController : MonoBehaviour
{
public float sheildSpeed = 2f;
void FixedUpdate()
{
this.GetComponent<Rigidbody2D>().MovePosition(this.transform.up * sheildSpeed);
}
}
注意
我希望我已经提供了足够的信息让你能够帮助我,但是如果你需要/想要更多的细节,请留下 aaa 评论,我希望会回复您需要的任何内容:)
嘿,我在自己的项目中对此进行了测试并使其正常工作
改变这个
void FixedUpdate()
{
this.GetComponent<Rigidbody2D>().MovePosition(this.transform.up * sheildSpeed);
}
进入这个
public void LaunchForward(float speed)
{
this.GetComponent<Rigidbody2D>().velocity = transform.up * speed;
}
我也把重生编辑了一下
public GameObject Shield;
public GameObject ShieldInstance;
if (Input.GetMouseButtonDown(0))
{
if (ShieldInstance != null) { return; }
ShieldInstance = Instantiate(Shield, transform.position + transform.forward + transform.up, transform.rotation);
ShieldInstance.transform.parent = transform;
}
if (Input.GetMouseButtonUp(0))
{
ShieldInstance.transform.parent = null;
ShieldInstance.GetComponent<ShieldController>().LaunchForward(5f);
Destroy(ShieldInstance, 3f);
}
但主要问题是防护罩本身的物理特性,代码与 2 个函数发生冲突,这导致了我认为的奇怪行为
编辑:设置速度只需要一次,因此这里使用专用方法是合适的(来源 derHugo)。
虽然您可以在播放器 class 中使用此方法,但如果您希望在游戏中有更复杂的行为
,则将其放在自己的 class 中会更好
信息
所以我正在尝试制作一款自上而下的无尽竞技场战斗游戏,你的盾牌也可以作为你的进攻手段。盾牌应该在玩家前方生成,并在玩家移动和旋转时保持在前方(同时按住 mouse1(确实如此))。一旦mouse1被释放,盾牌应该像弹丸一样向前发射。
问题
但是,当mouse1被释放时,盾牌向前移动一点然后冻结,但无论玩家在哪里,他们移动就像玩家在 0, 0.
(我知道这是有点混乱,所以这是一张照片:)
(三角形是玩家)
CODE
这是我的播放器控制器脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public Rigidbody2D rb;
public GameObject Shield;
public float moveSpeed = 4.3f;
public float sheildSpeed = 2f;
Vector2 movement;
bool isDead = false;
void Update()
{
movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");
Vector3 mouseScreen = Input.mousePosition;
Vector3 mouse = Camera.main.ScreenToWorldPoint(mouseScreen);
transform.rotation = Quaternion.Euler(0, 0, Mathf.Atan2(mouse.y - transform.position.y, mouse.x - transform.position.x) * Mathf.Rad2Deg - 90);
if (Input.GetMouseButtonDown(0)) {
Shield = Instantiate(Shield, transform.position + transform.forward + transform.up, transform.rotation);
Shield.transform.parent = transform;
}
if (Input.GetMouseButtonUp(0)) {
Shield.transform.parent = null;
}
}
void FixedUpdate() {
if (!isDead) {
rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
}
}
}
这是护盾脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShieldController : MonoBehaviour
{
public float sheildSpeed = 2f;
void FixedUpdate()
{
this.GetComponent<Rigidbody2D>().MovePosition(this.transform.up * sheildSpeed);
}
}
注意
我希望我已经提供了足够的信息让你能够帮助我,但是如果你需要/想要更多的细节,请留下 aaa 评论,我希望会回复您需要的任何内容:)
嘿,我在自己的项目中对此进行了测试并使其正常工作
改变这个
void FixedUpdate()
{
this.GetComponent<Rigidbody2D>().MovePosition(this.transform.up * sheildSpeed);
}
进入这个
public void LaunchForward(float speed)
{
this.GetComponent<Rigidbody2D>().velocity = transform.up * speed;
}
我也把重生编辑了一下
public GameObject Shield;
public GameObject ShieldInstance;
if (Input.GetMouseButtonDown(0))
{
if (ShieldInstance != null) { return; }
ShieldInstance = Instantiate(Shield, transform.position + transform.forward + transform.up, transform.rotation);
ShieldInstance.transform.parent = transform;
}
if (Input.GetMouseButtonUp(0))
{
ShieldInstance.transform.parent = null;
ShieldInstance.GetComponent<ShieldController>().LaunchForward(5f);
Destroy(ShieldInstance, 3f);
}
但主要问题是防护罩本身的物理特性,代码与 2 个函数发生冲突,这导致了我认为的奇怪行为
编辑:设置速度只需要一次,因此这里使用专用方法是合适的(来源 derHugo)。 虽然您可以在播放器 class 中使用此方法,但如果您希望在游戏中有更复杂的行为
,则将其放在自己的 class 中会更好