C# 统一队队员在向自己射击
我的游戏中有以下问题: 场景中有两个角色,他们可以互相射击。有一个空的游戏对象连接在彼此的前面,称为“繁殖子弹”,它会繁殖投射物,如图中所示 问题是,名为“玩家2”的游戏对象正在向自己射击,子弹正朝着他的方向移动。即使我旋转子弹。在播放器1中,它可以正常工作 此脚本附加到玩家C# 统一队队员在向自己射击,c#,unity3d,C#,Unity3d,我的游戏中有以下问题: 场景中有两个角色,他们可以互相射击。有一个空的游戏对象连接在彼此的前面,称为“繁殖子弹”,它会繁殖投射物,如图中所示 问题是,名为“玩家2”的游戏对象正在向自己射击,子弹正朝着他的方向移动。即使我旋转子弹。在播放器1中,它可以正常工作 此脚本附加到玩家 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public cl
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class Moviment : MonoBehaviour
{
//player variables
public GameObject player;
public GameObject[] Personagens;
//moving variables
Vector3 targetPosition;
float posY = 1;
public float velocity = 0.2f;
public float movMax = 3;
public bool ismoving = false;
public bool moveEnabled;
public int aux;
//bullet variables
public GameObject projetil;
private GameObject SpawBala;
public float ProjetilVeloc = 500f;
private void Start()
{
//sets the first unit as the active unit at the start of the game
Personagens[0].GetComponent<Jogador>().isPlayer = true;
TurnStart();
}
// Update is called once per frame
void Update()
{
//left mouse button to start movement
if (Input.GetMouseButtonDown(0))
{
//raycast checks and returns an object, if it's a tile, the unit moves
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
ismoving = true;
if (Physics.Raycast(ray, out hit))
{
if (hit.transform.tag == "Tile")
{
//checks if the tile is available based on the max movement of the unit
Tile tileAux = hit.transform.gameObject.GetComponent<Tile>();
Jogador scriptJog = player.GetComponent<Jogador>();
if ((tileAux.TilePostion.x - scriptJog.GridPosition.x) + (tileAux.TilePostion.y - scriptJog.GridPosition.y) >= -movMax && (tileAux.TilePostion.x - scriptJog.GridPosition.x) + (tileAux.TilePostion.y - scriptJog.GridPosition.y) <= movMax)
{
if ((tileAux.TilePostion.x - scriptJog.GridPosition.x) - (tileAux.TilePostion.y - scriptJog.GridPosition.y) >= -movMax && (tileAux.TilePostion.x - scriptJog.GridPosition.x) - (tileAux.TilePostion.y - scriptJog.GridPosition.y) <= movMax)
{
targetPosition = (hit.transform.position);
targetPosition.y = posY;
moveEnabled = true;
}
}
}
}
}
//right click to shoot
if (Input.GetMouseButtonDown(1))
{
//raycast checks and returns an object, if it's a tile, the unit shoots
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
//checks if the tile is available based on the line and column of the unit
Tile tileAux = hit.transform.gameObject.GetComponent<Tile>();
Jogador scriptJog = player.GetComponent<Jogador>();
if (tileAux.TilePostion.x == scriptJog.GridPosition.x || tileAux.TilePostion.y == scriptJog.GridPosition.y)
{
if (tileAux.TilePostion.x > scriptJog.GridPosition.x)
tileAux.TilePostion.x = 5;
else
tileAux.TilePostion.x = 0;
if (tileAux.TilePostion.y > scriptJog.GridPosition.y)
tileAux.TilePostion.y = 5;
else
tileAux.TilePostion.y = 0;
Debug.Log(tileAux.TilePostion.x);
Debug.Log(tileAux.TilePostion.y);
//instantiates the bullet
GameObject tiro = Instantiate(projetil, SpawBala.transform.position, Quaternion.identity, player.transform);
Rigidbody BalaRigid = tiro.GetComponent<Rigidbody>();
BalaRigid.AddForce(Vector3.forward * ProjetilVeloc);
}
}
}
//player moves until reaches the position
if (player.transform.position != targetPosition)
{
player.transform.position = Vector3.MoveTowards(player.transform.position, targetPosition, velocity);
if (player.transform.position == targetPosition)
ismoving = false;
}
//if player reaches position, it's deselected
if (moveEnabled && !ismoving)
{
player.GetComponent<Jogador>().isPlayer = false;
moveEnabled = false;
}
}
public void TurnStart()
{
//makes the selected unit the active unit
for (int i = 0; i < Personagens.Length; i++)
{
if (Personagens[i].GetComponent<Jogador>().isPlayer == true)
{
player = Personagens[i];
posY = player.transform.position.y;
targetPosition = player.transform.position;
SpawBala = player.transform.GetChild(0).gameObject;
}
}
}
public void TurnEnd()
{
//desactivates all units
for(int i = 0; i < Personagens.Length; i++)
{
Personagens[i].GetComponent<Jogador>().isPlayer = false;
}
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.AI;
公共类电影:单一行为
{
//玩家变量
公共游戏对象玩家;
公共游戏对象[]人物;
//移动变量
矢量3目标位置;
浮动posY=1;
公共浮子速度=0.2f;
公共浮动最大值=3;
公共bool ismoving=false;
公共布尔值已启用;
公共int aux;
//项目符号变量
公共游戏对象项目;
私人游戏对象SpawBala;
公共浮球项目=500f;
私有void Start()
{
//在游戏开始时将第一个单位设置为活动单位
Personagens[0]。GetComponent().isPlayer=true;
TurnStart();
}
//每帧调用一次更新
无效更新()
{
//鼠标左键开始移动
if(Input.GetMouseButtonDown(0))
{
//raycast检查并返回一个对象,如果它是平铺,则该单元将移动
Ray-Ray=Camera.main.screenpointoray(输入.鼠标位置);
雷卡斯特击中;
ismoving=真;
如果(物理.光线投射(光线,出击))
{
if(hit.transform.tag==“平铺”)
{
//根据设备的最大移动量检查磁贴是否可用
Tile tileAux=hit.transform.gameObject.GetComponent();
Jogador scriptJog=player.GetComponent();
如果((tileAux.TilePostion.x-scriptJog.GridPosition.x)+(tileAux.TilePostion.y-scriptJog.GridPosition.y)>=-movMax&&(tileAux.TilePostion.x-scriptJog.GridPosition.x)+(tileAux.TilePostion.y-scriptJog.GridPosition.y)=-movMax&(tileAux.TilePostion.x-scriptJog.GridPosition.x)-(tileAux.TilePostion.y-scriptJog.GridPositionscriptJog.GridPosition.x)
tileAux.TilePostion.x=5;
其他的
tileAux.TilePostion.x=0;
if(tileAux.TilePostion.y>scriptJog.GridPosition.y)
tileAux.TilePostion.y=5;
其他的
tileAux.TilePostion.y=0;
Log(tileAux.TilePostion.x);
Debug.Log(tileAux.TilePostion.y);
//实例化项目符号
GameObject tiro=实例化(projetil,SpawBala.transform.position,Quaternion.identity,player.transform);
刚体=tiro.GetComponent();
BalaRigid.AddForce(矢量3.forward*ProjetilVeloc);
}
}
}
向子弹添加力时,您使用的是矢量3.forward
。您需要使用transform.forward
Vector3.前进
始终是一个常数(0,0,1)。将其视为你们世界的前进方向。它永远不会改变
transform.forward
但是会给出游戏对象(玩家)的前向方向。当你旋转玩家时,它的transform.forward会相应改变
玩家1看起来工作正常的原因是因为它与向量3的方向相同。前进谢谢帮助,但它没有工作。玩家2仍在向自己射击。子弹朝他的方向移动。这很奇怪。你正在旋转玩家,而不是空的“子弹”gameObject是否正确?我正在旋转“SpawnBullet”游戏对象,但没有任何更改;\n您需要旋转玩家,而不是“SpawnBullet”游戏对象。transform.forward引用脚本附加到的对象,在本例中,该对象就是玩家。
//right click to shoot
if (Input.GetMouseButtonDown(1))
{
//raycast checks and returns an object, if it's a tile, the unit shoots
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
//checks if the tile is available based on the line and column of the unit
Tile tileAux = hit.transform.gameObject.GetComponent<Tile>();
Jogador scriptJog = player.GetComponent<Jogador>();
if (tileAux.TilePostion.x == scriptJog.GridPosition.x || tileAux.TilePostion.y == scriptJog.GridPosition.y)
{
if (tileAux.TilePostion.x > scriptJog.GridPosition.x)
tileAux.TilePostion.x = 5;
else
tileAux.TilePostion.x = 0;
if (tileAux.TilePostion.y > scriptJog.GridPosition.y)
tileAux.TilePostion.y = 5;
else
tileAux.TilePostion.y = 0;
Debug.Log(tileAux.TilePostion.x);
Debug.Log(tileAux.TilePostion.y);
//instantiates the bullet
GameObject tiro = Instantiate(projetil, SpawBala.transform.position, Quaternion.identity, player.transform);
Rigidbody BalaRigid = tiro.GetComponent<Rigidbody>();
BalaRigid.AddForce(Vector3.forward * ProjetilVeloc);
}
}
}