我从一个小型射击游戏开始,但是我的角色有问题。手臂必须旋转360º,但身体只能向右或向左旋转(取决于鼠标在哪里旋转手臂)。
到目前为止,我在下面的视频中看到了什么,但是在教程的帮助下,我遇到了两个大问题。
我能够旋转并翻转手臂,但不能翻转身体。
此外,当向右射击时,子弹会从我创建的火点正确退出,但是在武器向左翻转后,子弹(和武器射击)不再对齐。
我尝试过的这种方法对这个问题不是最好的吗?
感谢您的帮助。
游戏链接:https://vimeo.com/310853740
这是我的手臂旋转脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ArmRotation : MonoBehaviour
{
SpriteRenderer spriteRend;
void Awake()
{
spriteRend = GetComponent<SpriteRenderer>();
}
void Update()
{
AimArmAtMouse();
}
void AimArmAtMouse()
{
Vector2 mousePosition = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector2 armToMouse = mousePosition - (Vector2)transform.position;
float rotationZ = Vector2.SignedAngle(transform.right, armToMouse);
transform.Rotate(0f, 0f, rotationZ);
FlipArm(Vector2.SignedAngle(transform.right, Vector2.right));
}
void FlipArm(float rotation)
{
if (rotation < -90f || rotation > 90f)
{
spriteRend.flipY = true;
}
else
{
spriteRend.flipY = false;
}
}
}
答案 0 :(得分:1)
这是因为在翻转精灵时不会翻转火点。 我为您重新编写了脚本,以包含对Firepoint的引用。我还添加了一个“ FlipFirePoint”函数,该函数由“ FlipArm”函数调用。它应该可以解决您的对齐问题。
using UnityEngine;
public class ArmRotation : MonoBehaviour
{
SpriteRenderer spriteRend;
public Transform firePoint;
void Awake()
{
spriteRend = GetComponent<SpriteRenderer>();
}
void Update()
{
AimArmAtMouse();
}
void AimArmAtMouse()
{
Vector2 mousePosition = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector2 armToMouse = mousePosition - (Vector2)transform.position;
float rotationZ = Vector2.SignedAngle(transform.right, armToMouse);
transform.Rotate(0f, 0f, rotationZ);
FlipArm(Vector2.SignedAngle(transform.right, Vector2.right));
}
void FlipArm(float rotation)
{
if (rotation < -90f || rotation > 90f)
{
spriteRend.flipY = true;
FlipFirePoint(true);
}
else
{
spriteRend.flipY = false;
FlipFirePoint(false);
}
}
void FlipFirePoint(bool flip)
{
var pos = firePoint.localPosition;
pos.x = Mathf.Abs(pos.x) * (flip ? -1 : 1);
firePoint.localPosition = pos;
}
}
答案 1 :(得分:0)
@Sean,我将main_body与手臂分开,并制作了一个仅用于身体旋转的新脚本,但现在我发生了这种情况:
代码:
void Update()
{
Flip();
}
void Flip()
{
Vector3 theScale = transform.localScale;
Vector3 pos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0);
float WorldXPos = Camera.main.ScreenToWorldPoint(pos).x;
if (WorldXPos > gameObject.transform.position.x)
{
theScale.x = 1;
transform.localScale = theScale;
}
else
{
theScale.x = -1;
transform.localScale = theScale;
}
}}
几乎到了但我还不需要