[英]Why is GameObject2 moving towards the original position of GameObject1 instead of it's current position?
我目前有一個游戲對象(一個敵人)應該向另一個游戲對象(玩家)移動,而是向玩家的原始位置 (0, 0) 移動。 我已經遇到了敵人遠離玩家而不是向他們移動的問題,我通過在 Vector2 前面添加一個 - 符號來解決這個問題。 附加到兩個對象的腳本如下。 我知道兩者在其他方面都沒有得到優化,但現在我只關心搞砸的運動。
游戲對象 1(玩家):
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Threading;
public class PlayerController : MonoBehaviour
{
public Rigidbody2D body;
public float secondFraction = 0.166f;
public float horizontal;
public float vertical;
public float fire;
public float diaFactor = 0.7f;
public Vector2 move;
Transform transform;
public Collider2D collider2d;
public float runSpeed = 4f;
public Bounds Bounds => collider2d.bounds;
public SpriteRenderer spriteRenderer;
public bool atkOn = false;
public bool canAtk = true;
void Awake()
{
Sprite sadBloc = Resources.Load<Sprite>("Sad Pink Bloc");
Sprite atk1 = Resources.Load<Sprite>("atk1");
Sprite atk2 = Resources.Load<Sprite>("Attack Pink Bloc-2.png");
Sprite atk3 = Resources.Load<Sprite>("Attack Pink Bloc-3.png");
Sprite atk4 = Resources.Load<Sprite>("Attack Pink Bloc-4.png");
Sprite atk5 = Resources.Load<Sprite>("Attack Pink Bloc-5.png");
Sprite atk6 = Resources.Load<Sprite>("Attack Pink Bloc-6.png");
body = GetComponent<Rigidbody2D>();
collider2d = GetComponent<Collider2D>();
spriteRenderer = GetComponent<SpriteRenderer>();
canAtk = true;
Debug.Log("All good in Awake!");
Debug.Log(0.166f);
//spriteRenderer.sprite = Resources.Load<Sprite>("Cyan 128 Bloc");
}
IEnumerator startAtk ()
{
Sprite happyBloc = Resources.Load<Sprite>("Happy Pink Bloc");
Sprite atk1 = Resources.Load<Sprite>("atk1");
Sprite atk2 = Resources.Load<Sprite>("Attack Pink Bloc-2.png");
Sprite atk3 = Resources.Load<Sprite>("Attack Pink Bloc-3.png");
Sprite atk4 = Resources.Load<Sprite>("Attack Pink Bloc-4.png");
Sprite atk5 = Resources.Load<Sprite>("Attack Pink Bloc-5.png");
Sprite atk6 = Resources.Load<Sprite>("Attack Pink Bloc-6.png");
Sprite idle = Resources.Load<Sprite>("Pink Bloc");
atkOn = true;
canAtk = false;
Debug.Log("Pre Render");
spriteRenderer.sprite = atk1;
yield return new WaitForSeconds(0.166f);
spriteRenderer.sprite = atk2;
yield return new WaitForSeconds(0.166f);
spriteRenderer.sprite = atk3;
yield return new WaitForSeconds(0.166f);
spriteRenderer.sprite = atk4;
yield return new WaitForSeconds(0.166f);
spriteRenderer.sprite = atk5;
yield return new WaitForSeconds(0.166f);
spriteRenderer.sprite = atk6;
yield return new WaitForSeconds(0.166f);
spriteRenderer.sprite = idle;
atkOn = false;
canAtk = true;
Debug.Log("Post Render");
}
IEnumerator testAtk ()
{
Sprite cyanBloc = Resources.Load<Sprite>("Cyan 128 Bloc");
spriteRenderer.sprite = cyanBloc;
yield return new WaitForSeconds(1);
spriteRenderer.sprite = Resources.Load<Sprite>("Pink Bloc");
}
protected void Update ()
{
horizontal = Input.GetAxis("Horizontal");
vertical = Input.GetAxis("Vertical");
fire = Input.GetAxis("Fire1");
move.x = horizontal;
move.y = vertical;
if (Input.GetKeyDown("e") && canAtk)
{
Debug.Log("Conditional works!");
StartCoroutine(startAtk());
}
}
protected void FixedUpdate()
{
if (move.x > 0.01f)
spriteRenderer.flipX = false;
else if (move.x < -0.01f)
spriteRenderer.flipX = true;
if (move.y > 0.01f)
spriteRenderer.flipY = false;
else if (move.y < -0.01f)
spriteRenderer.flipY = true;
if (horizontal != 0 && vertical != 0) // Check for diagonal movement
{
horizontal *= diaFactor;
vertical *= diaFactor;
}
body.velocity = new Vector2(horizontal * runSpeed, vertical * runSpeed);
}
}
游戲對象 2(敵人):
using System.Collections.Generic;
using System;
using UnityEngine;
public class EnemyController : MonoBehaviour
{
public float zero = 0f;
public float horizontal;
public float vertical;
public float diaFactor = 0.7f;
public Rigidbody2D body;
public Vector2 move;
public Collider2D collider2d;
public SpriteRenderer spriteRenderer;
Transform selfTrans;
public float runSpeed = 4f;
public float detectDist = 3.425f;
public GameObject g;
Vector2 plrG;
bool isActive = true;
bool shouldMove = false;
Transform plrTrans;
Sprite emptySprite;
SpriteRenderer plrSR;
private PlayerController playerController;
void Awake()
{
emptySprite = Resources.Load<Sprite>("nosprite");
body = GetComponent<Rigidbody2D>();
plrSR = g.GetComponent<SpriteRenderer>();
spriteRenderer = GetComponent<SpriteRenderer>();
selfTrans = GetComponent<Transform>();
plrTrans = g.GetComponent<Transform>();
playerController = g.GetComponent<PlayerController>();
}
void Update()
{
}
void FixedUpdate()
{
plrG = plrTrans.position;
float step = runSpeed * Time.deltaTime;
if (isActive)
{
Debug.Log("IsActive");
if (isWithin(detectDist))
{
Debug.Log(plrG.x + " " + plrG.y);
Debug.Log(selfTrans.position.x + " " + selfTrans.position.y);
body.velocity = -Vector2.MoveTowards(selfTrans.position, new Vector2(plrG.x, plrG.y), step);
if (isWithin(1f) && playerController.atkOn)
{
turnOff();
}
else if (isWithin(1f))
{
Time.timeScale = 0;
plrSR.sprite = Resources.Load<Sprite>("Sad Pink Bloc");
}
}
else
{
body.velocity = new Vector2(0f, 0f);
}
}
}
void turnOff()
{
isActive = false;
spriteRenderer.sprite = emptySprite;
}
bool isWithin(float dist)
{
float rDist = Vector2.Distance(selfTrans.position, g.transform.position);
return rDist < dist;
}
}```
這是問題
body.velocity = -Vector2.MoveTowards(selfTrans.position, new Vector2(plrG.x, plrG.y), step);|
您正在將某個位置設置為您的速度。 嘗試從類似的東西開始:
body.velocity = (plrG - selfTrans.position).normalized * step;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.